贪心算法
顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。
虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
例:用贪心法求解付款问题
假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角现金,为使付出的货币的数量最少首先选出1张面值不超过4元6角的最大面值的货币,即2元,再选出1张面值不超过2元6角的最大面值的货币,即2元再选出1张面值不超过6角的最大面值的货币,即5角,再选出1张面值不超过1角的最大面值的货币,即1角总共付出4张货币。
总结起来,本题要求如下:
面值:5元 2元 1元 5角 2角 1角
需要付款:4元6角
贪心思想
在付款问题每一步的贪心选择中,在不超过应付款金额的条件下,只选择面值最大的货币,而不去考虑在后面看来这种选择是否合理,而且它还不会改变决定:一旦选出了一张货币,就永远选定。付款问题的贪心选择策略是尽可能使付出的货币最快地满足支付要求,其目的是使付出的货币张数最慢地增加,这正体现了贪心法的设计思想。
但是这种贪心思想并非对于任何问题都有效。比如,面值变成如下情况:
面值:10元 7元 5元 1元
需要付款:12元
贪心算法结果:10元+1元+1元
实际上最优情况:7元+5元
分析后我认为,当任一级别钱币面值*2>高一级别钱币面值
时,贪心算法不能在任意付款需求时给出全局最优解。(个人想法)
贪心算法的设计思路
贪心算法的设计思路是:总是做出在当前看来最好的选择,即贪心算法并不是从整体最优考虑,它所做的选择只是在某种意义上的局部最优选择。
贪心算法的基本要素
贪心算法与0-1背包问题
手动证明0-1背包问题具有最优子结构:
以下为假设背包容量与物品状态
以下为反证法
0-1背包问题不具有贪心选择性质。
原因是无法保证能够将背包装满,而所剩空间降低了背包的总价值。
背包问题具有贪心选择性质。
用贪心算法解背包问题的基本步骤
1.计算每种物品单位重量的价值 Vi/Wi;
2.按照单位重量的价值从高到低的顺序排序;
3.依据贪心选择策略,按照单位价值从高到低的顺序,依次将尽可能多的物品装入背包中。直到背包装满为止。是否可以将物品装入背包的条件是:有空间
伪代码