递归法求01背包问题
- 格式:wps
- 大小:95.50 KB
- 文档页数:3
递归法求01背包问题
一、问题描述
0/1背包问题:
现有n种物品,对1<=i<=n,已知第i种物品的重量为正整数W i,价值为正整数V i,背包能承受的最大载重量为正整数W,现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过W且总价值尽量大。
(注意:这里对每种物品或者全取或者一点都不取,不允许只取一部分)
二、算法分析
递归法:
在利用递归法解决0-1背包问题时,我们可以先从第n个物品看起。
每次的递归调用都会判断两种情况:
(1)背包可以放下第n个物品,则x[n]=1,并继续递归调用物品重量为W-w[n],物品数目为n-1的递归函数,并返回此递归函数值与v[n]的和作为背包问题的
最优解;
(2)背包放不下第n个物品,则x[n]=0,并继续递归调用背包容量为W,物品数目为n-1的递归函数,并返回此递归函数值最为背包问题的最优解。
递归调用的终结条件是背包的容量为0或物品的数量为0.此时就得到了0-1背包问题的最优解。
用递归法解0-1背包问题可以归结为下函数:
⎩⎨⎧+---=][])[,1(),1(),(n v n w m n KnapSack m n KnapSack m n KnapSack n
n 选择了物品没有选择物品 第一个式子表示选择物品n 后得到价值][])[,1(n v n w m n KnapSack +--比不选择物品n 情况下得到的价值),1(m n KnapSack -小,所以最终还是不选择物品n;第二个式子刚好相反,选择物品n 后的价值][])[,1(n v n w m n KnapSack +--不小于不选择物品n 情况下得到了价值),1(m n KnapSack -,所以最终选择物品n 。
在递归调用的过程中可以顺便求出所选择的物品。
下面是标记物品被选情况的数组x[n]求解的具体函数表示:
⎩⎨⎧=1
0][n x ][])[,1(),(),1(),(n v n w m n KnapSack m n KnapSack m n KnapSack m n KnapSack +--=-= 在函数中,递归调用的主体函数为KnapSack ,m 表示背包的容量,n 表示物品的数量,x[n]表示是否选择了第n 个物品(1—选,0—不选)。
每个物品的重量和价值信息分别存放在数组w[n]和v[n]中。
具体的代码见《递归法》文件夹。
三.运行结果。