贪心算法简介
与其说是贪心算法,不如说是贪心策略,解决问题的策略:从局部最优解推出全局最优解。
- 把解决问题的过程分为若干步
- 在解决每一步的时候,都选择当前最优的解法
- 希望得到全局最优解
例一:找零问题
我们手里有若干的纸币,1块、5块、10块、20块,现在用最少的张数,完成找零工作。
每次选择都选择当前能选择的最大面额
正确性证明:
这里能算出:
- C <= 1,因为2张10元面值可以替换成1张20元面值
- B <= 1,2张5元面值可以替换成1张10元面值
- A <= 4,5张1元面值可以替换成1张5元面值
要证明贪心策略正确,需证明
a == A && b == B && c == C && d == D
d >= D,因为每次都选择最大的,但是d > D不可能,因为后面的凑不出20块,最多
4 + 5 + 10 = 19
,所以
d == D
之后的
a、b、c
都是同理
这也是个面试题,之前遇到过:为什么人民币有1块、5块、10块、20块、50块这些面值,为什么要这样?
例二:最小路径和
从左上角到右下角,每次只能走一步,向下或者向右,求最少的路径和。
每一步都选择当前最小的:
这里通过贪心,得到的结果并不是正确的
例三:背包问题
假设每个物品有无穷多个,此时所能装的最大价值是多少
这里有三个条件:
- 背包容量
- 物品体积
- 物品价值
- 贪心策略1: 选择体积最小的,就装最小的
1 * 8 = 8
- 贪心策略2: 选择价值最大的
10 + 1 + 1 + 1 = 13
- 贪心策略3: 单位体积(
价值w / 体积v
)的价值最大10 + 1 + 1 + 1 = 13
此时的三种贪心策略,都是错的...
通过上述三个例子,贪心算法即只考虑眼前最大利益,从而希望得到全局最大利益的。
贪心算法特点:
- 贪心策略的提出,每次的标准都是不一样的
- 贪心策略不一定正确,而正确的贪心策略,需要证明(证明稍微复杂)
贪心策略很多很多,前期学习将重点放在贪心策略上,将此策略当作经验吸收即可;
学到一定程度,可以尝试深究策略正确性的证明。