多重背包是每件物品最多选择s个,可以选1,2,3,...
分组背包是每组有多个,但是这一组最多选择一个
对于多重背包,枚举物品,然后体积(一维倒序)之后决策,选择k个
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110;
int f[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int w,v,s;
cin>>w>>v>>s;
for(int j = m;j>=w;j--)
{
for(int k =0;k<=s;k++)
if(j>=k*w)
f[j] =max(f[j],f[j-k*w] + k*v);
}
}
cout<<f[m];
}
对于分组背包,物品,体积(倒序),决策,选择1,2,3,4...第k个
#include<iostream>
#include<algorithm>
using namespace std;
const int N =110;
int f[N],w[N],v[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
for(int j=1;j<=t;j++)
{
cin>>w[j]>>v[j];
}
for(int j=m;j>=0;j--)
{
for(int k=1;k<=t;k++)
if(j>=w[k])
f[j] =max(f[j],f[j-w[k]] + v[k]);
}
}
cout<<f[m];
}
因为都是选择一类,所以是倒序枚举,有01背包的影子