看B站上闫总的背包问题九讲吧。
1270:【例9.14】混合背包
混合背包就是把三种背包问题叠加起来。做题的时候对每种情况分别对待就可以了。
cv代码
#include<bits/stdc++.h>
using namespace std;
int w[10000],c[10000],p[10000],f[10000];
int main(){
int m,n;
cin>>m>>n;
for(int i=1;i<=n;i++)
cin>>w[i]>>c[i]>>p[i];
for(int i=1;i<=n;i++){
if(p[i]==0){//完全背包
for(int j=w[i];j<=m;j++)
f[j]=max(f[j],f[j-w[i]]+c[i]);
}
else{
for(int j=1;j<=p[i];j++)
for(int k=m;k>=w[i];k--){
f[k]=max(f[k],f[k-w[i]]+c[i]);
}
}
}
cout<<f[m]<<endl;
return 0;
}