因为我们知道求解多重背包时,是将其进行二进制优化为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背包标记为1c-=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~