贪心算法和动态规划(2)
来源:互联网 发布:寻找淘宝客 编辑:程序博客网 时间:2024/06/12 23:28
(1)找出最优解的性质,并刻划其结构特征。
(2)递归地定义最优值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造最优解。
当然,这个步骤在现在看起来会比较唐突,接下来我们会以01背包问题为例,具体说
明。
c.适用条件:
另外我想说:
(1).一个最优化策略的子策略总是最优的。等于你解决了一个大问题时,它的所有子问
题你也都有了最优解。
(2).以前的状态无法对直接影响未来的决策。
(3).之前讲到会保存子问题的答案,可以避免大量的运算,减少冗余。
以上的三个性质也即就是表明了我们的动态规划算法适用于解决“对应”(比如利用第
三个性质 就适用于子
问题复杂计算是具有冗余的问题)的问题。以上三个性质可以说是三个适用条件,用
书本上看不懂的表达分
别叫做:最优化原理、无后效性、子问题重叠性。
d.01背包问题:
有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是
6,3,5,4,6,现在给你个
承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
首先呢我们需要定义一些表达式的含义(如下):
w[i]:第i个物体的重量;
p[i]:第i个物体的价值;
c[i][m]:前i个物物体放入承重为m的背包的最大价值;
c[i-1][m]:前i个物体放入承重为m的背包的最大价值;
c[i-1][m-w[i]]:前i-1个物体放入承重为m-w[i]的背包的最大价值;
OK,有了这些基础,我们就可以根据之前总结好的步骤来解州01背包问题了。
(1)找出最优解的性质,并刻画其结构特征
性质:要求出背包承重为10所能装的最大价值总和.当背包承重为小于10的时候,其最
优解应该是此问题最优解的子
(2)递归的定义最优值:
首先:c[i][m]=c[i-1][m] (当背包不能再装第i个物体时,那么
最大价值总和等前i-1个是相同的)
c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}(当背
包可以装第i个物体时,那么其最大价值总和是c[i-1][m-w[i]]+pi和 c[i-1][m]中
较大的那一个)
(3)以自底向上的方式计算最优值:
根据上面的转移方程,由低上上计算最优值
(4)根据计算最优值时得到的信息,构造最优解。(下图来自:这里)
10的动态过程。此外,为了理解,前i件物品的试图放入背包顺序可以这样认为:
e,d,c,b,a.即就是e是第一个,d是第二个物体,,,,a是第五个物体。
比如:e2格表示当背包承重为2时,重量为4的e物体是不能放进去的。那么b2格
表示当背包承重2时,e,d,c都无法装入背包,b装入背包,价值为3.那么a2表
示,当背包承重为2时,e,d,c都无法装入背包,a,b可以装入,但是相比较a是最优
解。所以价值从3更新为6。
那么我们在来看a8=15(即就是c[5][8])是怎么得出来的。根据状态转移方程:
c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}我们知道要求出c[5][8],
我们需要先比较c[4][8]和c[4][6]+p[5](p[5]就是a的价值,a是第5个物体)由表可知:
c[4][8]=9;c[4][6]+p[5]=9+6=15;所以c[5][8]也就是a8的值为15.
这就是经典的01背包问题。大家感受一下动态规划的魅力。
想要了解贪心算法:请点击这里
- 贪心算法和动态规划(2)
- 贪心算法和动态规划
- 动态规划和贪心算法
- 贪心算法和动态规划
- 贪心算法和动态规划
- 动态规划和贪心算法
- 动态规划法和贪心算法
- 贪心算法和动态规划的区别
- 动态规划和贪心算法的区别
- 动态规划和贪心算法的区别
- 动态规划和贪心算法的区别
- 动态规划和贪心算法的区别
- 背包问题:动态规划和贪心算法
- 动态规划和贪心算法的区别
- 动态规划和贪心算法的区别
- 贪心算法和动态规划区别
- 动态规划和贪心算法的比较
- 算法基础-->贪心和动态规划
- Sap NetWeaver CE7.1删除目录功能
- OCP-1Z0-051-题目解析-第24题
- javascript之词法分析
- 读书笔记----ARM Cortex-M3权威指南(第二章)
- 解决自定义文件上传处理与Spring MultipartResolver的冲突问题
- 贪心算法和动态规划(2)
- 黑马程序员D8 多线程
- 文件上传利器SWFUpload使用指南
- Oracle静默安装日志
- 组合数学
- Perl 安装 模块Net::SSH2 有些0day是ssh2
- 素数判断算法(高效率)
- 【设计模式】——策略模式之赌球风波
- Oracle Block scn/commit scn/cleanout scn 说明