-
C - 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活
- HDU - 2191
- 题目名字是相当的长。还是裸的多重背包注意这里是以钱数为容量,以体积为价值不要弄反即可。
-
#include<bits/stdc++.h> using namespace std; #define maxn 1222 int dp[maxn],sum,n,w; struct node { int v,w,k; } num[maxn]; void zeropack(int C,int W) { for(int i=sum; i>=C; i--) dp[i]=max(dp[i],dp[i-C]+W); } void compack(int C,int W) { for(int i=C; i<=sum; i++) dp[i]=max(dp[i],dp[i-C]+W); } void mult() { memset(dp,0,sizeof(dp)); for(int i=1; i<=n; i++) { if(num[i].k*num[i].v>sum) compack(num[i].v,num[i].w); else { int temp=1; while(temp<num[i].k) { zeropack(temp*num[i].v,temp*num[i].w); num[i].k-=temp; temp<<=1; } zeropack(num[i].k*num[i].v,num[i].k*num[i].w); } } printf("%d\n",dp[sum]); } int main() { int cas=1; scanf("%d",&cas); while(cas--) { scanf("%d%d",&sum,&n); for(int i=1; i<=n; i++)scanf("%d%d%d",&num[i].v,&num[i].w,&num[i].k); mult(); } return 0; }