设计贪心算法的三个步骤
将最优化问题转化为这样的形式:对其做出一次选择后,只剩下一个子问题需要求解(比较重要的一步)
证明作出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的
证明作出贪心选择后,剩余的子问题满足性质:其最优解与贪心选择组合即可得到原问题的最优解,这样就得到了最优子结构
两个关键因素
1.
贪心选择性质:可以通过做出局部最优(贪心)选择来构造全局最优解;即每个步骤做出贪心选择能生成全局最优解【视不同具体问题进行证明,没有普遍适用的方法】
2.
最优子结构:一个问题的最优解包含其子问题的最优解
经典最优化问题的
两个变形
0-1背包问题:一个正在抢劫的小偷发现了n个商品,第i个商品价值vi美元,重wi磅,vi和wi都是整数;小偷想尽可能拿走价值更多的商品,但是他的背包最多能容纳W磅的商品,W是一个整数【对每个商品,不能拿走一部分,要么完整拿走,要么留下)
分数背包问题:条件和0-1背包问题一样,但对每个商品,小偷可以拿走一部分
两个问题都有最优子结构,很相似,但是
贪心算法可以求解分数背包问题,而不能求解0-1背包问题
分数背包问题:计算每个商品的每磅价值vi/wi,每次选择每磅价值最高的商品即可
0-1背包问题:因为小偷无法装满背包,空闲空间降低了方案的有效每磅价值;当我们考虑一个商品食肉装入背包,需要比较包含此商品的子问题的解和不包含它的子问题的解,然后才能做出选择
当然,由于两个问题都有最优子结构,所以能用动态规划算法进行求解。