Judge Info
- Memory Limit: 32768KB
- Case Time Limit: 2000MS
- Time Limit: 2000MS
- Judger: Number Only Judger
Description
给两个有一定容量的箱子,往里面装宝石(宝石容量不能超过箱子容量),不同的宝石有不同的容量和价值。求两个箱子里最大宝石的价值。
Input
包含多组测试数据,每一组数据的信息如下
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:宝石价值
Output
两个箱子里的宝石的最大价值。
Sample Input
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
Sample Output
44 66
这次虽然是01背包,但是却有两个背包,对此,我们只需做两个变化
1.状态转移方程变为:当前背包总价值=max(当前这个东西不放进去的价值,当前这个东西放到第一个箱子的价值,当前这个东西放到第二个箱子的价值)
2.dp数组改成二维,可以遍历两个背包的所有状态
#include<stdio.h>
const int MAXCOST=200;
const int MAXNUM=200;
int dp[MAXCOST][MAXCOST];
int cost[MAXNUM];
int value[MAXNUM];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int c1,c2;
scanf("%d%d",&c1,&c2);
for(int i=0;i<=c1;i++)
for(int j=0;j<=c2;j++)
dp[i][j]=0;
for(int i=1;i<=n;i++)
scanf("%d%d",&cost[i],&value[i]);
for(int i=1;i<=n;i++)
for(int j=c1;j>=0;j--)
for(int k=c2;k>=0;k--)
{
if(j>=cost[i]&&dp[j][k]<dp[j-cost[i]][k]+value[i]) dp[j][k]=dp[j-cost[i]][k]+value[i];
if(k>=cost[i]&&dp[j][k]<dp[j][k-cost[i]]+value[i]) dp[j][k]=dp[j][k-cost[i]]+value[i];
}
printf("%d\n",dp[c1][c2]);
}
return 0;
}