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) 编辑 收藏 举报