http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086
思路 裸的多重背包 巩固一下刚学的骚操作
#include<bits/stdc++.h> using namespace std; const int maxn = 110; int w[maxn],p[maxn],c[maxn];//分别表示 体积 价值和数量 int dp[50100]; int main () { int n,W; cin >> n >> W; for(int i=1;i<=n;i++) cin>>w[i]>>p[i]>>c[i]; for(int i=1;i<=n;i++) { if(w[i]*c[i] > W)//完全背包 { for(int j=w[i];j <= W;j++) dp[j] = max(dp[j],dp[j-w[i]]+p[i]); } else { int k=1,t=c[i]; while (t>k) { for(int j=W;j >= w[i]*k;j--) dp[j] = max(dp[j],dp[j-w[i]*k]+k*p[i]); t-=k,k*=2; } for(int j=W;j>=w[i]*t;j--) dp[j] = max(dp[j],dp[j-w[i]*t]+t*p[i]); } } cout<<dp[W]<<endl; }