题解
【提高】混合背包
1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int f[1005]; int main(){ int N,V; scanf("%d%d",&N,&V); for(int i=1;i<=N;i++){ int v,w,s; scanf("%d%d%d",&v,&w,&s); if(s==-1){ for(int j=V;j>=v;j--) f[j]=max(f[j],f[j-v]+w); }else if(s==0){ for(int j=v;j<=V;j++) f[j]=max(f[j],f[j-v]+w); }else{ int k=1; while(k<=s){ for(int j=V;j>=k*v;j--) f[j]=max(f[j],f[j-k*v]+k*w); s-=k; k*=2; } if(s>0){ for(int j=V;j>=s*v;j--) f[j]=max(f[j],f[j-s*v]+s*w); } } } printf("%d",f[V]); return 0; }
- 1