贪心的基本步骤:
1)决定问题的最优子结构;
2)设计出一个递归解;
3)证明在递归的任一阶段,最优选择之一总是贪心选择。那么,做贪心选择总是安全的;
4)证明通过做贪心选择,只有一个子问题;
5)设计出一个实现贪心策略的递归算法;
6)将递归算法转换成迭代算法。
更一般的,可以用下面的方式来描述:
1)将优化问题转化成先做出选择,再解决剩下的一个子问题;
2)证明原问题总是有一个最优解是做贪心选择得到的,从而证明贪心选择是安全的;
3)在作出贪心选择之后,剩余的子问题具有这样的一个性质:如果将子问题的最优解和之前所做的贪心选择联合起来,可以得出原问题的一个最优解。
贪心选择性质:一个全局最优解可以通过局部最优(贪心)选择来达到。
在贪心算法中,所做的总是看似最佳的选择,然后再解决选择之后所出现的子问题。
最优子结构:对于一个问题来说,如果它的一个最优解包含了其子问题的最优解,则称该问题具有最优子结构。
贪心与动态规划的区别
动态规划和贪心算法都是一种递推算法 均用局部最优解来推导全局最优解 。
区别:
动态规划
全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。
条件:最优子结构;重叠子问题。
方法:自底向上构造子问题的解。
例子:子序列最大和问题,滑雪问题
贪心算法
条件:每一步的最优解一定依赖上一步的最优解。
方法:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。
具体的可以参考0-1背包和部分背包问题。
—————————————————————————————————
本文原创自Slience的csdn技术博客。
本博客所有原创文章请以链接形式注明出处。
欢迎关注本技术博客,本博客的文章会不定期更新。
大多数人想要改造这个世界,但却罕有人想改造自己。
世上没有绝望的处境,只有对处境绝望的人。
————By slience
—————————————————————————————————