【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=3449
题目意思
有N个箱子,每个箱子需要花费Ai的代价
箱子里面有K个物品,K个物品你可以选择买任意个,但每个物品只能买一个,每个物品有相应的花费和价值
你又M的大洋,最后问最多能得到多少价值物品。
解题思路
先对每组选择里的所有物品进行0-1背包处理,但背包容量为(总容量-盒子容量);然后跟上一组的状态比较来决定这一组选择 是选还是不选,取其中的较大值。
代码部分
#include<stdio.h>
#include<string.h>
const int MAX=100010;
int dp[MAX];
int tmp[MAX];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,sum,p,m,w,v,i,j,k;
while(scanf("%d%d",&n,&sum)!=EOF)
{
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
scanf("%d%d",&p,&m);
memcpy(tmp,dp,sizeof(dp));//继承前面的
for(j=0;j<m;j++)
{
scanf("%d%d",&w,&v);
for(k=sum-p;k>=w;k--)//先将附件进行1次01背包
tmp[k]=max(tmp[k],tmp[k-w]+v);
}
for(j=p;j<=sum;j++)//更新能更新的
dp[j]=max(dp[j],tmp[j-p]); //分组背包
}
printf("%d\n",dp[sum]);
}
return 0;
}