【解题报告】【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 }

 

posted on 2012-07-21 18:51  coding封神  阅读(123)  评论(0编辑  收藏  举报

导航