01背包问题是
f[j]=max(f[j],f[j-v[i]]+w[i]);
多重背包
f[j]=max(f[j],f[j-v[i]+w[i],f[j-2*v[i]]+2*w[i],f[j-3*v[i]]+w[i]...);
因为数据较少 100的三次方为1000000,可以用三重循环实现
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
int n,m;
int f[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int v,w,s;
cin>>v>>w>>s;
for(int j=m;j>=0;j--)//与01背包一样从大到小枚举
for(int k=1;k<=s&&k*v<=j;k++)
{
f[j]=max(f[j],f[j-k*v]+k*w);
}
}
cout<<f[m]<<endl;
return 0;
}