多重背包模板
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int dp[150]; void x01back(int w,int v,int W) { for(int i=W;i>=w;i--){ dp[i]=max(dp[i],dp[i-w]+v); } } void multiback(int w,int v,int num,int W) { if(w*num>=W){ for(int i=w;i<=W;i++){ dp[i]=max(dp[i],dp[i-w]+v); } } else{ for(int i=1;i<num;i<<=1){ x01back(w*i,v*i,W); num-=i; } x01back(num*w,num*v,W); } } int main() { int T; int n,m; int w[108],v[108],num[108]; scanf("%d",&T); while(T--){ memset(dp,0,sizeof(dp)); scanf("%d%d",&m,&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&w[i],&v[i],&num[i]); } for(int i=1;i<=n;i++){ multiback(w[i],v[i],num[i],m); } printf("%d\n",dp[m]); } }
如需转载,请注明出处
如有侵权,联系删除
2290713181@qq.com
如有侵权,联系删除
2290713181@qq.com