一、贪心算法的概念
考察一个实例,找硬币问题。有四种面值的硬币二角五分,一角,五分,一分。现在要找给顾客六角三分钱,使用贪心算法求解过程如下:
首先在所有硬币中找出面值不大于六角三分的最大面值的硬币,显然二角五分满足条件,那么接下来六角三分-二角五分剩下三角八分,那么按照刚才的办法,在所有硬币中找出不大于三角八分的面值最大的硬币,显然又是二角五分,剩下来一角三分,在接下来一样的办法,在所有硬币中找出不大于一角三分的面值最大的硬币,显然为一角硬币,以此类推,最终得到结果两枚二角五分的硬币和一枚一角硬币和三枚一分硬币。
这就是贪心算法求解问题的过程,也就是说贪心算法并不从整体最优上考虑问题,它在每一步做出的选择都是在当前的某个局部或者某种意义上来说是最优的,从而最终得到整体的最优解,有可能并不是最优解,但贪心算法在某些场合能取到最优解。例如刚才的找硬币问题找到的就是最优解。贪心算法相比于动态规划算法来说更容易理解,算法更简单。
二、贪心算法的两个要素
1、最优子结构的性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构的性质。通俗的来说就是任何规模的子问题的最优解包含在整个问题的最优解当中。
2、贪心选择性质
贪心选择性质其实就是能找到一种贪心策略,通过这个策略一步步求解最终能得到整体的最优解。
在贪心算法中,每一步计算都选择的是仅在当前状态下做出的最优选择,并不依赖于未来的选择。对于一个具体的问题需要确定他是否具有贪心选择性质,必须证明每一步所做的贪