问题:n:物品数量 m:背包容量
第i号物品有s个,体积是v,价值是w,求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。【输出最大价值。】
首先,多重背包由于每个种类的物品选择数量有限,因此可将每个种类中的每个物品都看成01背包考虑,即若一类物品最大数量为s,则将该类物品拆分为s个数量为1的物品,再将所有类拆分出来的所有物品一起做01背包下的决策。
//O(n*m^2)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=110;
int f[N];
int n,m;
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--)
for(int k=0;k<=s&&k*v<=j;k++)
f[j]=max(f[j],f[j-k*v]+k*w);
}
cout<<f[m];
return