贪心
贪心策略:每次决策时采取当前最优策略。
要求:问题的整体最优性可以由局部最优性导出。
无后效性
即,某个状态以后的过程不会影响以前的状态,只与当前状态有关。
算法设计的关键是贪心策略的选择。
算法思路
- 建立数学模型来描述问题(可行性证明)
- 把需要求解的问题划分为若干个子问题
- 对每一个子问题,求出局部最优解
- 将子问题的解组合,得到全局最优解
例题
钱币找零问题
【问题】
有面值1元、5元、10元、20元、50元和100元的纸币各若干张,支付固定金额k元。
求最少需要多少张纸币?
【思路】
优先使用面值更大的纸币。
活动安排问题
【问题】
有n个不能同时进行的活动。每个活动有起始时间si和结束时间fi,满足si<fi。
求最多能进行多少活动?
【思路】
优先选择结束时间最早的活动。
部分背包问题
【问题】
给定一个最大负重为m的背包和n种物品。第i种物品重量wi,价格vi。
求能使背包中放入物品最大的价格之和。
【思路】
将每个物品按照单位重量的价格从大到小进行排序。
优先装入排序靠前的物品,至背包装满或无物品可装入为止。
算法证明
贪心算法的正确性需要证明,常用的证明方法有:
-
微扰(邻项交换)
证明在任意局面下,任何对于局部最优策略的微小改变都会造成整体结果变差,经常用于以“排序”为贪心策略的证明。
-
范围缩放
证明任何对局部最优策略的作用范围的扩展都不会造成整体结果变差。
-
决策包容性
证明在任意局面下,作出局部最优策略以后,在问题状态空间中的可达集合包含了做出其它任何决策后的可达集合。
换言之,这个局部最优策略提供的可能性包含其他所有策略提供的可能性。
- 反证法
- 数学归纳法