【解题报告】【HDOJ2191】【多重背包】悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
思路是将数量为n的物品按1 2 4 8 16.....分割成多个物品,然后按0/1背包的思路做,1 2 4 8...分别代替二进制中的一个位,可以通过加得到任何数,如13分为 1 2 4 6
1 #include<stdio.h> 2 #include<string.h> 3 #define MAX 510 4 #define max(a,b) (a>b?a:b) 5 int main() 6 { 7 int value[MAX],weight[MAX],record[MAX]; 8 int i,j,step,zhishu,p,h,c,C,n,m; 9 //freopen("1.txt","r",stdin); 10 scanf("%d",&C); 11 while(C--) 12 { 13 step=0; 14 scanf("%d%d",&n,&m); 15 for(i=0;i<m;i++) 16 { 17 scanf("%d%d%d",&p,&h,&c); 18 zhishu=1; 19 while(c-zhishu>0) 20 { 21 weight[step]=h*zhishu; 22 value[step++]=p*zhishu; 23 c-=zhishu; 24 zhishu*=2; 25 } 26 weight[step]=h*c; 27 value[step++]=p*c; 28 } 29 memset(record,0,sizeof(record)); 30 for(i=0;i<step;i++) 31 { 32 for(j=n;j>=value[i];j--) 33 record[j]=max(record[j],record[j-value[i]]+weight[i]); 34 } 35 printf("%d\n",record[n]); 36 } 37 return 0; 38 }