HDU3449 Consumer(有依赖背包)

来源:互联网 发布:apache impala 安装 编辑:程序博客网 时间:2024/06/05 16:48

【题目链接】
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;}
原创粉丝点击