贪心的基本步骤:

1)决定问题的最优子结构;

2)设计出一个递归解;

3)证明在递归的任一阶段,最优选择之一总是贪心选择。那么,做贪心选择总是安全的;

4)证明通过做贪心选择,只有一个子问题;

5)设计出一个实现贪心策略的递归算法;

6)将递归算法转换成迭代算法。


更一般的,可以用下面的方式来描述:

1)将优化问题转化成先做出选择,再解决剩下的一个子问题;

2)证明原问题总是有一个最优解是做贪心选择得到的,从而证明贪心选择是安全的;

3)在作出贪心选择之后,剩余的子问题具有这样的一个性质:如果将子问题的最优解和之前所做的贪心选择联合起来,可以得出原问题的一个最优解。


贪心选择性质:一个全局最优解可以通过局部最优(贪心)选择来达到。

在贪心算法中,所做的总是看似最佳的选择,然后再解决选择之后所出现的子问题。


最优子结构:对于一个问题来说,如果它的一个最优解包含了其子问题的最优解,则称该问题具有最优子结构。


贪心与动态规划的区别

动态规划和贪心算法都是一种递推算法 均用局部最优解来推导全局最优解 。

区别:

动态规划
全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。
条件:最优子结构;重叠子问题。
方法:自底向上构造子问题的解。
例子:子序列最大和问题,滑雪问题
贪心算法
条件:每一步的最优解一定依赖上一步的最优解。
方法:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。

具体的可以参考0-1背包和部分背包问题。


参考:《算发导论》(第二版) 机械工业出版社