数据结构常见问题:12单元23 背包问题.docx
《数据结构常见问题:12单元23 背包问题.docx》由会员分享,可在线阅读,更多相关《数据结构常见问题:12单元23 背包问题.docx(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构课程常见问题单元23背包问题i.背包问题如何用求解?解析:一、 问题描述0/1背包问题:现有n种物品,对ICiCn,第i种物品的重量为正整数Wi,价值为正整数Vi,背包能承受的最大 载重量为正整数肌 现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过W且总价值尽量 大。(注意:这里对每种物品或者全取或者一点都不取,不允许只取一局部)二、算法分析根据问题描述,可以将其转化为如下的约束条件和目标函数:于是,问题就归结为寻找一个满足约束条件(1),并使目标函数式(2)到达最大的解向量。首先说明一下0T背包问题拥有最优解。假设是所给的问题的一个最优解,那么是下面问题的一个最优解:。如
2、果不是的话,设是这个问题的 一个最优解,那么,且。因此,这说明是所给的0-1背包问题比更优的解,从而与假设矛盾。穷举法:用穷举法解决0T背包问题,需要考虑给定n个物品集合的所有子集,找出所有可能的子集(总重量不 超过背包重量的子集),计算每个子集的总重量,然后在他们中找到价值最大的子集。由于程序过于简单, 在这里就不再给出,用实例说明求解过程。下面给出了 4个物品和一个容量为10的背包,下列图就是用穷 举法求解0-1背包问题的过程。(a)四个物品和一个容量为10的背包序号 子集 总重量 总价值 序号 子集 总重量 总价值1空集2 1 73 2 34 3 45 4 56 1, 21空集2 1 7
3、3 2 34 3 45 4 56 1, 20042 1012 1140 1225 1310 5492,37522,48373,49651,2,3) 14不可行14 1,3,4 16 不可行1,2,4) 15不可行7 1, 3 11不可行8 1, 4 12不可行7 1, 3 11不可行8 1, 4 12不可行15 (2, 3, 4) 12 不可行16 (1,2,3,419 不可行(b)用回溯法求解0-1背包问题的过程递归法:在利用递归法解决0-1背包问题时,我们可以先从第n个物品看起。每次的递归调用都会判断两种情况:(1)背包可以放下第n个物品,那么xn = l,并继续递归调用物品重量为W-wn
4、,物品数目为n-1的递 归函数,并返回此递归函数值与vn的和作为背包问题的最优解;(2)背包放不下第n个物品,那么xn=0,并继续递归调用背包容量为肌物品数目为nT的递归函数, 并返回此递归函数值最为背包问题的最优解。递归调用的终结条件是背包的容量为0或物品的数量为0.此时就得到了 0-1背包问题的最优解。用递归法解0-1背包问题可以归结为下函数:第一个式子表示选择物品n后得到价值比不选择物品n情况下得到的价值小,所以最终还是不选择 物品n;第二个式子刚好相反,选择物品n后的价值不小于不选择物品n情况下得到了价值,所以最终选 择物品no在递归调用的过程中可以顺便求出所选择的物品。下面是标记物品
5、被选情况的数组xn求解的具体函 数表示:在函数中,递归调用的主体函数为KnapSack, m表示背包的容量,n表示物品的数量,xn表示是 否选择了第n个物品(1一选,0一不选)。每个物品的重量和价值信息分别存放在数组wn和vn中。具 体的代码见递归法文件夹。贪心法:0T背包问题与背包问题类似,所不同的是在选择物品装入背包时,可以选择一局部,而不一定要全部 装入背包。这两类问题都具有最优子结构性质,相当相似。但是背包问题可以用贪心法求解,而0T背包 问题却不能用贪心法求解。贪心法之所以得不到最优解,是由于物品不允许分割,因此,无法保证最终能 将背包装满,局部闲置的背包容量使背包单位重量的价值降低
6、了。事实上,在考虑0T背包问题时,应比 较选择物品和不选择物品所导致的方案,然后做出最优解。由此导出了许多相互重叠的子问题,所以,0-1 背包问题可以用动态规划法得到最优解。在这里就不再用贪心法解0-1背包问题了。动态规划法分析:0-1背包问题可以看作是寻找一个序列,对任一个变量 的判断是决定=1还是=0.在判断完之后, 已经确定了,在判断时,会有两种情况:(1)背包容量缺乏以装入物品i,那么二0,背包的价值不增加;(2)背包的容量可以装下物品i,那么=1,背包的价值增加。这两种情况下背包的总价值的最大者应该是对判断后的价值。令表示在前i个物品中能够装入容量为 j的背包的物品的总价值,那么可以
7、得到如下的动态规划函数:式(1)说明:把前面i个物品装入容量为0的背包和把0个物品装入容量为j的背包,得到的价 值均为0.式(2)第一个式子说明:如果第i个物品的重量大于背包的容量,那么装入第i个物品得到的最 大价值和装入第iT个物品得到的最大价值是相同的,即物品i不能装入背包中;第二个式子说明:如果 第i个物品的重量小于背包的容量,那么会有两种情况:(1)如果把第i个物品装入背包,那么背包中物品的 价值就等于把前iT个物品装入容量为的背包中的价值加上第i个物品的价值;(2)如果第i个物品没 有装入背包,那么背包中物品的价值就是等于把前iT个物品装入容量为j的背包中所取得的价值。显然, 取二者
8、中价值较大者作为把前i个物品装入容量为j的背包中的最优解。我们可以一步一步的解出我们所需要的解。第一步,只装入第一个物品,确定在各种情况下背包 能得到的最大价值;第二步,只装入前两个物品,确定在各种情况下的背包能够得到的最大价值;一次类 推,到了第n步就得到我们所需要的最优解了。最后,便是在容量为W的背包中装入n个物品时取得的 最大价值。为了确定装入背包的具体物品,从的值向前寻找,如果,说明第n个物品被装入了背包中, 前n-l个物品被装入容量为的背包中;否那么,第n个物品没有装入背包中,前n-l个物品被装入容量为W 的背包中。依此类推,直到确定第一个物品是否被装入背包为止。由此,我们可以得到如
9、下的函数:.根据动态规划函数,用一个的二维数组C存放中间变量,表示把前i个物品装入容量为j的背 包中获得的最大价值。设物品的重量存放在数组wn中,价值存放在数组vn中,背包的容量为肌数组存放迭代的结 果,数组xn存放装入背包的物品,动态规划解0T背包问题的源代码在文件夹动态规划法中。 回溯法分析:用回溯法解0背包问题时,会用到状态空间树。在搜索状态空间树时,只要其左儿子结点是一个可行 结点,搜索就进入其左子树。当右子树有可能包含最优解时才进入右子树搜索,否那么将右子树剪去。设r 是当前剩余物品价值总和;cp是当前价值;bestp是当前最优价值。当cp+rWbestp时丁可剪去右子树。 计算右子
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构常见问题:12单元23 背包问题 数据结构 常见问题 12 单元 23 背包 问题
限制150内