问题: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

本文探讨了多重背包问题的解决方法,通过将物品拆分为二进制组合,降低复杂度至log级别。介绍了使用单调队列进行状态更新的优化技巧,确保在更新背包容量价值时能按顺序进行,并讨论了数据范围增大时的处理策略。
最低0.47元/天 解锁文章
977

被折叠的 条评论
为什么被折叠?



