多重背包

多重背包问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值