数据结构第6章_刘震.pptVIP

  • 7
  • 0
  • 约9.26千字
  • 约 45页
  • 2016-11-23 发布于天津
  • 举报
数据结构第6章_刘震.ppt

二、重叠子问题 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。 0-1背包问题 0-1背包问题 给定n种物品和一背包 物品i的重量是wi0,其价值为vi0 背包的容量为C。 问应如何选择装入背包的物品,使得装入背包中物品的总价值最大且总重量小于C? 装入方法:每种物品只有两种选择,即装入背包或不装入。不能将物品多次装入也不能只装入一部分 1 价值 18 22 28 1 重量 5 6 6 2 7 物品 1 3 4 5 2 C = 11 1 5 4 1 5 3 4 1 5 2 3 4 1 5 1 18 6 22 1 18 6 28 22 1 18 6 7 28 22 1 18 6 6 7 28 22 1 18 6 5 6 7 28 22 1 18 6 2 5 6 7 28 22 1 18 6 1 2 5 6 7 28 22 1 18 6 例如: { 3, 4 } has value 40. 问题可以进一步抽象为找出n元 向量x1,x2,…,xn。满足约束条件下的 最优化问题 背包问题变形 一个果农想将自己种植的N种水果运到市场上出售,现该果农只有一辆存储容量为C吨的卡车。每种水果单箱的重量分别为wi(吨),每种水果单箱的价值分别为vi,每种水果该卡车最多能存储1箱。 该果农应该如何装箱才能获得最多收益? 一货船载重量为C吨,现有N种货物要装船运输,每种货物的重量分别为wi (吨),每种货物的价值分别为vi ,每种货物该船最多能装载1件。 如何装载货物获得最大价值? 0-1背包问题 如何分析子问题结构? 能否将n分为 {1,2,…k}{k+1,…,n}? 同前面分析过程一样,将规模为n的问题分解为规模为n-1和1两个子问题的解。 假设(y1,y2,…yn)是一个最优解,则(y2,…yn)是下面相应子问题的一个最优解 0-1背包问题 证明: 用反证法证明。 若不然,设(z2,..,zn)是子问题的一个最优解,而(y2,..,yn)不是最优解,由此可知 且 因此 这说明(y1,z2,…,zn)是所给0-1背包问题的更优解,从而(y1,y2,…,yn)不是0-1背包问题的最优解,此为矛盾 分析过程1 定义 OPT(n) = 由1, …, n个物体装填背包所产生的最大价值. Case 1: OPT 不选择第 n个物体. OPT 为{ 1, 2, …,n-1 }个物体装填背包所产生的最大价值 Case 2: OPT 选择第 n个物体进行装填. 接收物体n并不意味我们必须拒绝其他物体? 在不知道其它哪些物体已经在n前被选择的情况下我们也并不能知道是否有足够的空间能容纳物体n? 这样分析问题会带来更多的子问题! 分析过程2 –添加一个变量j 添加一变量j 定义 m(i, j) =背包容量为j,由1, …, i个物体装填背包问题的最优值 Case 1: m(i,j) 不选择第 i个物体. m(i,j)为{1, …,i-1 }个物体装填背包所产生的最大价值,当重量限制为j Case 2: m(i,j) 选择第 i个物品. 新的重量限制为 = j – wi m(i,j) 为新重量限制下,{1, …,i-1 }个物体装填背包所产生的最大价值 Void knapsack(int []v, int []w,int c, int [][]m) { for j = 0 to C M[0][j] = 0 for i = 1 to n for j = 1 to C if (wi j) M[i][j] = M[i-1][j] else M[i][j] = max {M[i-1][j], vi + M[i-1][j-wi ]} return M[n][C] 0-1背包问题算法 0个物体 i从1到 n 算法复杂度分析: 从m(i,j)的递归式容易看出,算法需要O(nc)计算时间。当背包容量c很大时,算法需要的计算时间较多。例如,当c2n时,算法需要Ω(n2n)计算时间。 例子 n + 1 ? { 1, 2 } { 1, 2, 3 } { 1, 2, 3, 4 } { 1 } { 1, 2, 3, 4, 5 } 0 0 0 0 0 0 0 1 0 1 1 1 1 1 2 0 6 6 6 1 6 3 0 7 7

文档评论(0)

1亿VIP精品文档

相关文档