多重背包问题学习
板子
多重背包对比01背包只是次数有了限定
而一般采用2进制优化方案!
上板子
#include <iostream>
using namespace std;
int f[20005];
int v[20005];
int val[20005];
int main(){
int n,m,s,v1,val1;
cin>>n>>m;
int cnt=0;
for(int i=1;i<=n;i++){
cin>>v1>>val1>>s;
int k=1;
while(k<=s){
cnt++;
v[cnt]=k*v1;
val[cnt]=k*val1;
s-=k;
k*=2;
}
if(s > 0){
cnt++;
v[cnt] = s*v1;
val[cnt] = s*val1;
}
}
int n=cnt;
for(int i=1;i<=n;i++){
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+val[i]);
}
}
cout<<f[m];
return 0;
}