HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
多重背包模板题
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n, dp[105]; struct Dami { int v, w, d; } ri[105]; void deal(int x) { int i; if(ri[x].d*ri[x].v>=n) { for(i=ri[x].v;i<=n;i++) dp[i]=max(dp[i],dp[i-ri[x].v]+ri[x].w); } else { int k=1; while(k<ri[x].d) { for(i=n;i>=ri[x].v*k;i--) dp[i]=max(dp[i-ri[x].v*k]+ri[x].w*k,dp[i]); ri[x].d-=k; k*=2; } for(i=n;i>=ri[x].v*ri[x].d;i--) { dp[i]=max(dp[i-ri[x].v*ri[x].d]+ri[x].w*ri[x].d,dp[i]); } } } int main() { int T, m, i; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); for(i=0;i<m;i++) scanf("%d%d%d",&ri[i].v,&ri[i].w,&ri[i].d); for(i=0;i<m;i++) deal(i); printf("%d\n",dp[n]); } return 0; }