HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

 

题意:不解释。。。

分析:裸的多重背包。

AC代码:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int maxm=105;
 5 int f[maxm],cost[maxm],val[maxm],num[maxm];
 6 int n,m;
 7 
 8 int max(int a,int b){
 9     return a>b?a:b;
10 }
11 
12 void CompletePack(int c,int v){
13     int i;
14     for(i=c;i<=m;i++)
15         f[i]=max(f[i],f[i-c]+v);
16 }
17 
18 void ZeroOnePack(int c,int v){
19     int i;
20     for(i=m;i>=c;i--)
21         f[i]=max(f[i],f[i-c]+v);
22 }
23 
24 int main()
25 {
26     int i,j,T,k;
27     scanf("%d",&T);
28     while(T--){
29         scanf("%d %d",&m,&n);
30         for(i=1;i<=n;i++)
31             scanf("%d %d %d",&cost[i],&val[i],&num[i]);
32         for(i=0;i<=m;i++)
33             f[i]=0;
34         for(i=1;i<=n;i++){
35             if(cost[i]*num[i]>=m)
36                 CompletePack(cost[i],val[i]);
37             else{
38                 k=1;
39                 while(k<num[i]){
40                     ZeroOnePack(k*cost[i],k*val[i]);
41                     num[i]-=k;
42                     k<<=1;
43                 }
44                 ZeroOnePack(num[i]*cost[i],num[i]*val[i]);
45             }
46         }
47         printf("%d\n",f[m]);
48     }
49     return 0;
50 }

 

posted on 2013-03-05 12:57  Acmer_Roney  阅读(194)  评论(0编辑  收藏  举报

导航