贪心策略的基本内容
一、贪心算法的构造步骤
a) 将优化问题转化为这样一个问题:即先做出选择,在解决剩下的一个子问题。
b) 证明原问题总是有一个最优解是做贪心选择得到的,从而说明贪心选择的安全。
c) 说明在做出贪心选择后,剩余的子问题都有这样一个性质。即如果将自问题的最优解和我们所做的贪心选择联合起来,可以得出原问题的一个最优解。
二、贪心选择的关键特点
a) 一个全局最优解可以通过局部最优(贪心)的选择来得到。
b) 和动态规划的不同:动态规划每一步都要做出选择,并且这些选择依赖于子问题的解。所以动态规划一般是自底向上的。
三、最优子结构
一个问题的最优解包含了子问题的最优解。
评价动态规划以及贪心算法可应用性进行评估的关键一点。
四、贪心算法和动态规划的区别:
0-1 背包问题 和 部分背包问题
0-1背包
最优子结构
假设有个方案使得背包负重范围内的价值最高,那么从背包中拿掉某样物品,并将负重减掉该物品的重量。包中剩余的物品在背包剩余的负重中包含的物品价值依然是最高。
一个递归解
设重量为W的物品,对于集合S={S1,S2 ... Sn},最大的价值为,物品j的价值为,重量为
有:
= { | max{ + } (Wj <= W) |
0 (当S只包含一个元素Sj,并且W < wj 时, 或者W=0,或者W < )
| |
(当S只包含一个元素Sj,并且W >= wj 时)
|
递归实现:
动态规划实现:
感觉这个问题子问题的解的可复用不高,怎么考虑都要M*N2 的运行时间,不知如何实现O(N W) 的运行时间