问题描述
给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
算法设计分析
背包问题要求达到物品总价值的最优化,每一次选择作为一个阶段,根据前一个阶段的解可以求解出后一个阶段的解。定义状态F[i,y],表示剩余容量为y,剩余物品为i, i+1, i+2 ,…, n的最优解。所以:
(2)式便是状态转移方程,而(1)式则是边界条件。
例如:假定n=5,物品收益p=[6,3,5,4,6],物品重量w=[2,2,6,5,4],且背包容量c=10。
要求的F[1, 10]是整个问题的解,F[1,10]=max{F[2, 10], F[2, 8]+6},依次类推。调用关系用解空间树表示出来:
每个节点用y值来标识,即F[i,y],其左孩子表示不选择物品i,得到F[i+1,y];右孩子表示选择物品i,得到F[i+1,y-wi]+pi;从图中可以看出,对于F[3,8],F[4,8],F[4,2],F[5,8],F[5,2]的有重复计算。对于这种重叠子问题的计算,所以我们可以通过使用一