多重背包问题
问题:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件体积是v[i],重量是w[i]。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且重量总和最大。
一维数组
多重背包二进制压缩
多重背包O(N*V)算法
总个数 n
总体积 maxv
设每件对于每件物品I
价值 w[i]
体积 v[i]
个数 m[i]
辅助数组 b:array[1..maxv] of integer
记录数组 f:array[1..maxv] of integer
伪代码
for i:=1 to n do
for j:=v[i] to maxv do
begin
for k:=v[i] to maxv do b[k]:=0;
temp:=f[j-v[i]]+w[i];
if (temp>f[j]) and (b[j]<m[i]) then
begin
f[j]:=temp;
b[j]:=b[j-v[i]]+1;
{这一句记录了F[V]中放置第i个物品的个数}
end;
end;
对于混合背包,只须将0-1的m[i]:=0,
无限使用的m[i]:=trounc(maxv/v[i]),就行了,不需分类讨论
//对于上面的b[ ]不甚明了……
资料来源http://blog.csdn.net/power721/archive/2009/08/30/4500615.aspx