关于贪心算法,也称贪婪算法,顾名思义是在当前状态下尽可能多的获得东西,不考虑之后的情况,也就是只求局部最优解,而局部最优解是否能成为全局最优解就不一定了,因此贪心法能解决的问题有限,在某些情况下,贪心法的确能取得最优解,但很多时候,其所求得的只是次优解,因此,判断一个问题用贪心法得到的局部最优解是否能成为全局最优解十分重要,在分析一个问题是,贪心法可以选择的判断标准有很多:如在背包问题中,是选取总价值最大的还是单位重量价值最大的来装入背包呢?不同的选取标准采用贪心法所得到的不一定是最优解,因此,选取一个合适,正确的判断标准就很重要。
贪心算法每一步必须满足一下条件:
1、可行的:即它必须满足问题的约束。
2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。
3、不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。
例题
[背包问题]有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
[均分纸牌]有N堆纸牌,编号分别为1,2,…,n。每堆上有若干张,但纸牌总数必为n的倍数.可以在任一堆上取若干张纸牌,然后移动。移牌的规则为:在编号为1上取的纸牌,只能移到编号为2的堆上;在编号为n的堆上取的纸牌,只能移到编号为n-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
//贪心算法所作的选择可以依赖于以往所作过的选择,但决不依赖于将来的选择,也不依赖于子问题的解,因此贪心算法与其他算法相比具有一定的速度优势。如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。