51Nod1086html
分析:二進制優化多重揹包,推薦一篇不錯的blog,點我ios
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 const int maxn=5e5+10; 7 int n,m; 8 int w[maxn],p[maxn],c[maxn]; 9 long long dp[maxn]; 10 int main() 11 { 12 cin>>n>>m; 13 for(int i=1;i<=n;i++) 14 scanf("%d%d%d",&w[i],&p[i],&c[i]); 15 int cnt=n; 16 for(int i=1;i<=n;i++){ 17 for(int j=1;;j*=2){ 18 if(c[i]>=j){ 19 ++cnt; 20 w[cnt]=j*w[i],p[cnt]=j*p[i],c[i]-=j; 21 }else{ 22 w[i]=c[i]*w[i],p[i]=p[i]*c[i];break; 23 } 24 } 25 } 26 for(int i=1;i<=cnt;i++){ 27 for(int j=m;j>=w[i];j--){ 28 dp[j]=max(dp[j],dp[j-w[i]]+p[i]); 29 } 30 } 31 cout<<dp[m]<<endl; 32 }