见闻广博|贪心算法小入门
Posted ECNU极客空间
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了见闻广博|贪心算法小入门相关的知识,希望对你有一定的参考价值。
五四青年节快乐
为了提高同学们的程序设计实践能力,我们又来啦!这次我们的主题是与上期主题动态规划密切相关的贪心算法。
贪心算法 (Greedy Algorithm):通过做出一系列选择来求出问题的最优解。在每个决策点,它做出在当时看来最佳的选择。这种启发式策略并不保证总能找到最优解,但对有些很多问题确实有效。
算法
设计贪心算法的几个步骤:
确定问题的最优子结构
设计一个递归算法
证明如果我们做出一个贪心选择,则只剩下一个子问题
证明贪心选择总是安全的
将递归算法转换为迭代算法
可是我们如何证明一个贪心算法能否求解一个最优问题呢?
贪心选择性质和最优子结构是两个关键要素,如果我们能够证明问题具有这些性质,就向贪心算法迈出了重要的一步。
贪心选择性质(greedy-choice property):我们可以通过做出局部最优选择来构造全局最优解。换句话说,当进行选择的时候,我们直接做出在当前问题中看来最优的选择,而不必考虑子问题的解。这也是贪心算法与动态规划的不同之处。
最优子结构:如果一个问题的最优解包含其子问题的的最优解,则称此问题具有最优子结构的性质,此性质是能否应用动态规划和贪心方法的
关键要素。
下面我们通过介绍一个问题来说明贪心算法和动态规划策略的细微差别和如何设计贪心算法:
0-1背包问题(0-1 knapsack proble ):
一个小偷在一个月黑风高的夜晚潜入了一家商店,小偷发现了n个商品,第i个商品价值Vi美元,重Wi磅。
虽然小偷想带走所有的商品,但是他的背包最多能容纳W磅的商品,对于每个商品,小偷只能选择拿走或者不拿,那么问题来了,小偷最多能拿走价值多少美元的商品呢?
在分数背包问题(fractional knapsack problem)中,设定与0-1背包问题是一样的,但对每个商品,小偷可以拿走其中的一部分。
虽然两个问题相似,但是我们用贪心策略可以求解分数背包问题,而不能求解0-1背包问题。
聪明的你是不是已经想到如何利用贪心算法解决分数背包问题了呢?其实很简单,只要你每次选择商品的时候选择单位质量价格最高的商品即可。下面我们来证明一下该方法的正确性。
证明:
我们首先假设我们有一个最优解A1,那么我们首先找到A1里面平均价值最高的物品am,让后我们将用商品里面平均价值最高的物品a1将am进行全部替换或者部分替换解A2,又因V1/W1≥Vm/Wm所以A2的总价值高于A1A1的总价值,这与A1是最优解矛盾,于是得到A1里面包含平均价值最高的物品。于是我们得到最优子结构Si=Sk+ak,ak是Si里面平均价值最高的,Sk是选择ak剩下来的物品。
好了,这次我们就介绍到这儿了,正所谓实践出真知,我们为大家准备了一箩筐的题。
一定要AC!
以上是关于见闻广博|贪心算法小入门的主要内容,如果未能解决你的问题,请参考以下文章