$\huge \color{orange}{成魔之路->}$ $\huge \color{purple}{算法提高课题解}$
01背包可参考: 01背包问题
完全背包可参考: 完全背包问题
多重背包二进制优化可参考: 多重背包问题 II
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,m;
int f[N];
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
int v,w,s;
cin>>v>>w>>s;
if(!s) //完全背包
{
for(int j=v;j<=m;j++)
f[j]=max(f[j],f[j-v]+w);
}
else //多重背包
{
if(s==-1) s=1; // 01 背包
for(int k=1;k<=s;k*=2)
{
for(int j=m;j>=k*v;j--)
f[j]=max(f[j],f[j-k*v]+k*w);
s-=k;
}
if(s)
{
for(int j=m;j>=s*v;j--)
f[j]=max(f[j],f[j-s*v]+s*w);
}
}
}
cout<<f[m]<<endl;
return 0;
}