装箱I(01背包)
描述
给两个有一定容量的箱子,往里面装宝石(宝石总容量不能超过箱子容量),不同的宝石有不同的容量和价值。求两个箱子里最大宝石的价值。
输入
line 1: Input n; n:表示宝石数量 1<n<100
line 2: Input C1,C2; C1:第一个箱子的容量 C2:第二个箱子的容量 1<C1,c2<100
line 3~n+3-1: Ci,Vi Ci:宝石容量 Vi:宝石价值
计算后的算有数据都在2^31内.
输出
两个箱子里的宝石的最大价值。
样例输入
4
10 20
5 20
11 15
6 8
8 9
6
10 20
6 8
4 15
8 9
4 16
15 20
3 15
样例输出
44
66
题目分析:
01背包,多开一维。
#include <bits/stdc++.h> using namespace std; int dp[105][105],w[105],v[105]; int main() { int n,c1,c2; while(~scanf("%d",&n)) { memset(dp,0,sizeof dp); scanf("%d%d",&c1,&c2); for(int i=1;i<=n;i++) scanf("%d%d",&w[i],&v[i]); for(int i=1;i<=n;i++) for(int j=c1;j>=0;j--) for(int k=c2;k>=0;k--) { if(j>=w[i]) dp[j][k]=max(dp[j][k],dp[j-w[i]][k]+v[i]); if(k>=w[i]) dp[j][k]=max(dp[j][k],dp[j][k-w[i]]+v[i]); } printf("%d\n",dp[c1][c2]); } return 0; }