题目
有一个容量为V的背包和N种物品,第i件物品的体积是c[i] 价值是w[i] 共有n[i]件,请给出一种策略使得装入背包中的物品价值最高.
基本算法
和完全背包问题类似,区别是完全背包每种物品的数量是无限的而多重背包是有限的.可以仿照完全背包写出状态转移方程:
f[i][v] = max(f[i-1][v-k*c[i]] + k*w[i] | 0<=k<=n[i])
转化为01背包
和完全背包类似,多重背包同样可以转化为01背包: 把第i种物品换成n[i]
件01背包中的物品,则可以将多重背包转化为01背包.
仍然可以像完全背包一样通过二进制来降低复杂度,将第i种物品换成若干件物品,其中每件物品有一个系数表示这件物品的体积和价值均是原来的系数倍,这些系数分别是1,2,4···2^(k-1),n[i]-2^k+1
,k满足2^k+1>n[i]
下面给出O(log amount)时间处理一件多重背包中物品的过程,其中amount表示物品的数量:
procedure MultiplePack(cost,weight,amount)
if cost*amount>=V
CompletePack(cost,weight)
return
integer k=1
while k<amount
ZeroOnePack(k*cost,k*weight)
amount=amount-k
k=k*2
ZeroOnePack(amount*cost,amount*weight)