0-1背包
问题描述 : 给定n种物品和一背包,物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品(物品不能分割),使得装入背包中物品的总价值最大? 抽象描述: x[n]:表示物品的选择,x[i]=1表示选择放进物品i到背包中。 问题分析: 1.抽象之后背包问题转换为找到一个最优的数组,x1,x2,.....,xn的0-1序列。 2.假设最优解的序列为x1,x2,.....,xn,能使背包容量C的总价值最大. 如果,x1=1,则x2,...,xn是C-w1容量的背包的总价值 依然是 最大的序列; 如果,x1=0,则x2,....,xn是C容量的背包的总价值 依然是 最大的序列。 这就是我们所说的最优子结构性质。 3.进一步分析:我们用m(i,j)表示为已经判断好了i:n的序列的背包最大价值,并且此时的背包剩余的容量为j,对物品i进行判断 如果j>wi, 就只要做出选择wi和不选择wi情况下,哪种更能使背包的总价值更大:m(i,j)=max{ m(i+1,j),m(i+1,j-wi)+vi} (注意这是个递归式) 如果j<wi: m(i,j)=m(i+1,j) 初始化: m(n,j)=vn (j>= wn); m(n,j)=0 (0<=j< wn) m(0,C)=0 最终的结果:m(1,C) 4.依次我们就得到了一个递归的表达式: 5.如果单纯的从利用递归