动态规划算法:0-1背包问题
- 格式:ppt
- 大小:118.50 KB
- 文档页数:12


0-1背包动态规划解决问题
一、问题描述:
有n个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
二、总体思路:
根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出01背包问题的最优解以及解组成,然后编写代码实现。
三、动态规划的原理及过程:
number=4,capacity=7
i 1 2 3 4
w(重量) 3 5 2 1
v(价值) 9 10 7 4
原理:
动态规划与分治法类似,都是把大问题拆分成小问题,通过寻找大问题与小问题的递推关系,解决一个个小问题,最终达到解决原问题的效果。但不同的是,分治法在子问题和子子问题等上被重复计算了很多次,而动态规划则具有记忆性,通过填写表把所有已经解决的子问题答案纪录下来,在新问题里需要用到的子问题可以直接提取,避免了重复计算,从而节约了时间,所以在问题满足最优性原理之后,用动态规划解决问题的核心就在于填表,表填写完毕,最优解也就找到。
过程:
a) 把背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选),Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积(重量);
b) 建立模型,即求max(V1X1+V2X2+…+VnXn);
c) 约束条件,W1X1+W2X2+…+WnXn
d) 定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值;
e) 最优性原理是动态规划的基础,最优性原理是指“多阶段决策过程的最优决策序列具有这样的性质:不论初始状态和初始决策如何,对于前面决策所造成的某一状态而言,其后各阶段的决策序列必须构成最优策略”。判断该问题是否满足最优性原理,采用反证法证明:
假设(X1,X2,…,Xn)是01背包问题的最优解,则有(X2,X3,…,Xn)是其子问题的最优解, 假设(Y2,Y3,…,Yn)是上述问题的子问题最优解,则理应有(V2Y2+V3Y3+…+VnYn)+V1X1 > (V2X2+V3X3+…+VnXn)+V1X1;
动态规划——01背包问题
⼀、最基础的动态规划之⼀
01背包问题是动态规划中最基础的问题之⼀,它的解法完美地体现了动态规划的思想和性质。
01背包问题最常见的问题形式是:给定n件物品的体积和价值,将他们尽可能地放⼊⼀个体积固定的背包,最⼤的价值可以是多少。我们可以⽤费⽤c和价值v来描述⼀件物品,再设允许的最⼤花费为w。只要n稍⼤,我们就不可能通过搜索来遍查所有组合的可能。运⽤动态规划的思想,我们把原来的问题拆分为⼦问题,⼦问题再进⼀步拆分直⾄不可再分(初始值),随后从初始值开始,尽可能地求取每⼀个⼦问题的最优解,最终就能求得原问题的解。由于不同的问题可能有相同的⼦问题,⼦问题存在⼤量重叠,我们需要额外的空间来存储已经求得的⼦问题的最优解。这样,可以⼤幅度地降低时间复杂度。
有了这样的思想,我们来看01背包问题可以怎样拆分成⼦问题:
要求解的问题是:在n件物品中最⼤花费为w能得到的最⼤价值。显然,对于0 <= i <= n,0 <= j <= w,在前i件物品中最⼤花费为j能得到的最⼤价值。
可以使⽤数组dp[n + 1][w + 1]来存储所有的⼦问题,dp[i][j]就代表从前i件物品中选出总花费不超过j时的最⼤价值。
可知dp[0][j]值⼀定为零。那么,该怎么递推求取所有⼦问题的解呢。显⽽易见,要考虑在前i件物品中拿取,⾸先要考虑前i - 1件物品中拿取的最优情况。
当我们从第i - 1件物品递推到第i件时,我们就要考虑这件物品是拿,还是不拿,怎样收益最⼤。
①:⾸先,如果j < c[i],那第i件物品是⽆论如何拿不了的,dp[i][j] = dp[i - 1][j];
②:如果可以拿,那就要考虑拿了之后收益是否更⼤。拿这件物品需要花费c[i],除去这c[i]的⼦问题应该是dp[i - 1][j - c[i]],这时,就要⽐较dp[i - 1][j]和dp[i - 1][j - c[i]] + v[i],得出最优⽅案。
问题描述
0/1 背包问题 :
现有 n 种物品,对 1<=i<=n ,已知第 i 种物品的重量为正整数 W i,价值为正整数 Vi, 背包能承受的最大载重量为正整数 W ,现要求找出这 n 种物品的一个子集,使得子集中物 品的总重量不超过 W 且总价值尽量大。 (注意:这里对每种物品或者全取或者一点都不取, 不允许只取一部分)
算法分析
根据问题描述,可以将其转化为如下的约束条件和目标函数:
n wi xi W
i 1 i i (1)
xi { 0,1}( 1 i n)
n
max vixi (2) i1
于是,问题就归结为寻找一个满足约束条件( 1 ),并使目标函数式( 2 )达到最大的
解向量 X (x1, x2 ,x3, ........... , xn) 。
首先说明一下 0-1 背包问题拥有最优解。
假设 (x1,x2,x3, ........ ,xn) 是所给的问题的一个最优解, 则(x2,x3, ............... ,xn)是下面问题的
n n n
个问 题 的 一 个 最 优解 , 则 viyi vixi , 且 w1x1 wiyi W 。 因此 ,
i 2 i 2 i 2 一个最优解: wixi W
i2 w1x1 n
max vi xi 。如果不是的话,设 (y2,y3, , yn ) 是这
xi {0,1}( 2 i n) i2 n n n
v1x1 viyi v1x1 vixi vixi ,这说明 (x1,y2,y3, ............. ,yn) 是所给的 0-1 背包问
i 2 i 2 i 1
题比 ( x1 , x 2 , x3 , ... , xn ) 更优的解,从而与假设矛盾。
穷举法:
用穷举法解决 0-1 背包问题,需要考虑给定 n 个物品集合的所有子集,找出所有可能 的子集(总重量不超过背包重量的子集) ,计算每个子集的总重量,然后在他们中找到价 值最大的子集。 由于程序过于简单,在这里就不再给出,用实例说明求解过程 。下面给出 了4个物品和一个容量为 10 的背包,下图就是用穷举法求解 0-1 背包问题的过程。
01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。
01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >=
Wi ), f[i-1,j] }
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?
题目描述:
有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
name weight value 1 2 3 4 5 6 7 8 9 10
a 2 6 0 6 6 9 9 12 12 15 15
15
b 2 3 0 3 3 6 6 9 9 9 10 11
c 6 5 0 0 0 6 6 6 6 6 10 11
d 5 4 0 0 0 6 6 6 6 6 10 10
e 4 6 0 0 0 6 6 6 6 6 6 6
只要你能通过找规律手工填写出上面这张表就算理解了01背包的动态规划算法。
首先要明确这张表是至底向上,从左到右生成的。
为了叙述方便,用e2单元格表示e行2列的单元格,这个单元格的意义是用来表示只有物品e时,有个承重为2的背包,那么这个背包的最大价值是0,因为e物品的重量是4,背包装不了。
对于d2单元格,表示只有物品e,d时,承重为2的背包,所能装入的最大价值,仍然是0,因为物品e,d都不是这个背包能装的。
同理,c2=0,b2=3,a2=6。
对于承重为8的背包,a8=15,是怎么得出的呢?
根据01背包的状态转换方程,需要考察两个值,
一个是f[i-1,j],对于这个例子来说就是b8的值9,另一个是f[i-1,j-Wi]+Pi;