因为我们知道求解多重背包时,是将其进行二进制优化为01背包问题,那么我们就将01背包和多重背包看成一种情况,然后只要处理,完全背包和01背包问题即可(详细看下方代码)
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int f[N],v[N],w[N],cnt,s[N],n,m,a,b,c;
void solve() {
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>a>>b>>c;
if(c==-1) v[cnt]=a,w[cnt]=b,s[cnt++]=1;//01背包
else if(c==0) v[cnt]=a,w[cnt]=b,s[cnt++]=0;//完全背包
else { //多重背包二进制优化转化为01背包
for(int k=1; k<=c; k<<=1) {
v[cnt]=k*a;
w[cnt]=k*b;
s[cnt++]=1;//01背包标记为1
c-=k;
}
if(c>0) {
v[cnt]=c*a;
w[cnt]=c*b;
s[cnt++]=1;
}
}
}
for(int i=1; i<=cnt; i++) {
if(s[i]==1) {//01背包情况
for(int j=m; j>=v[i]; j--) {
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
} else { //完全背包
for(int j=v[i]; j<=m; j--) {
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
}
cout<<f[m];
}
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
solve();
return 0;
}
over~