一、基本要素
1、最优子结构性质
大问题的最优解包含了小问题的最优解,小问题的最优解又可以合并成大问题的最优解。
最优子结构性质
2、重叠子问题性质
含有多个子问题,并且算法过程中会多次使用,这时动态规划法提供了查动态规划表的方法来简化流程,使重叠的子问题不会重复计算。
二、基本步骤
1、找出最优解的性质(分析其结构特征)
2、递归地定义最优值(写递归表达式)
3、自底向上计算最优值(填充动态规划表)
4、构造最优解(由表中信息)
三、动态规划法与分治法的区别
1、动态规划法经分解得到的子问题往往不是互相独立的,而分治法必须要求子问题独立。
2、分治法可能会多次计算同一子问题,而动态规划法利用查动态规划表,保存已经计算过的子问题解,避免了重复计算。
四、动态规划法与贪心算法的区别
贪心算法性质:每一步选择都采取当前状态下最优的选择,而不着眼于全局最优。
动态规划法(最优子结构+重叠子问题)——>自底向上
每一步的最优解由上一步的局部最优解进行选择得出,因此需要保存之前求解的所有子问题的最优解备查。
贪心算法(最优子结构+贪心选择性质)——>自顶向下
每一步的最优解由上一步的最优解推导而得,当前最优解包含上一步的最优解,但之前的最优解不做保留。因此,在贪心算法中,做出的每一步决策都无法改变。
相同点:两者都具有最优子结构性质(每一步的选择都将当前问题简化为一个规模更小的与原问题相同形式的子问题)
不同点:动态规划算法每步往往依赖于相关子问题的解,因而只有在解出相关子问题的解后才能做出选择。而贪心算法只着眼于当前状态的最优解,即局部最优选择,然后再去解出这个选择后的状态的相应的子问题。(自底向上与自顶向下)
区别两者的经典例子:0/1背包问题与背包问题
0/1背包问题与背包问题
0/1背包问题需采用动态规划算法达到最优解。
背包问题采用贪心算法可求解。
对于0/1背包问题,不能用贪心算法求解,为什么?
因为对该问题用贪心选择策略求解无法保证最后背包被装满,闲置的背包空间会影响每公斤背包的价值,进而影响整体求解的最大价值。
0/1背包问题应比较:选择与不选择两种方案的哪种更优,然后再进行下一步选择,这样会形成多个重叠子问题,须用动态规划中的动态规划表进行存储。
网友评论