贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
贪心算法的基本思路:
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解。
例题分析
[背包问题]有一个背包,背包容量是M=150。有7个物品,物品不可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
物品 A B C D E F G
重量 35 30 60 50 40 10 25
价值 10 40 30 50 35 40 30
分析:
目标函数: ∑pi最大
约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)
(1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?
(2)每次挑选所占重量最小的物品装入是否能得到最优解?
(3)每次选取单位重量价值最大的物品,成为解本题的策略。
值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。
贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。
可惜的是,它需要证明后才能真正运用到题目的算法中。
一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。
对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:
(1)贪心策略:选取价值最大者。
反例:
W=30
物品:A B C
重量:28 12 12
价值:30 20 20
根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。
(2)贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。
(3)贪心策略:选取单位重量价值最大的物品。
反例:
W=30
物品:A B C
重量:28 20 10
价值:28 20 10
根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。
【注意:如果物品可以分割为任意大小,那么策略3可得最优解】
对于选取单位重量价值最大的物品这个策略,可以再加一条优化的规则:对于单位重量价值一样的,则优先选择重量小的!这样,上面的反例就解决了。
但是,如果题目是如下所示,这个策略就也不行了。
W=40
物品:A B C
重量:28 20 15
价值:28 20 15
附:本题是个DP问题,用贪心法并不一定可以求得最优解,以后了解了动态规划算法后本题就有了新的解法。
备注:
贪心算法当然也有正确的时候。求最小生成树的Prim算法和Kruskal算法都是漂亮的贪心算法。
所以需要说明的是,贪心算法可以与随机化算法一起使用,具体的例子就不再多举了。(因为这一类算法普及性不高,而且技术含量是非常高的,需要通过一些反例确定随机的对象是什么,随机程度如何,但也是不能保证完全正确,只能是极大的几率正确)
分享到:
相关推荐
贪心算法 贪心算法 贪心算法 贪心算法 贪心算法 贪心算法
贪心算法、分治算法和动态规划的区别 贪心算法、分治算法和动态规划是三种常用的算法设计策略,每种算法都有其特点和应用场景。下面我们将对这三种算法进行详细的比较和分析。 分治算法 分治算法是一种将原问题...
用贪心算法解单源最短路径问题 在计算机科学和信息技术领域中,单源最短路径问题是指从一个源点到其他顶点的最短路径问题。它是一种典型的图论问题,广泛应用于交通网络、通信网络、计算机网络等领域。贪心算法是...
贪心算法是计算机科学中解决问题的一种策略,它通过在每一步选择局部最优解来尝试达到全局最优解。这种算法在很多问题中表现出高效性,尤其是在处理优化问题时。本资料包"贪心算法之最优合并问题.zip"显然是针对贪心...
在计算机科学与算法设计领域,贪心算法、动态规划和分治法是三种常见的解决问题的方法,它们各自有着独特的策略和适用场景。本文将深入探讨这些算法之间的区别以及它们的优缺点。 首先,贪心算法是一种在每一步选择...
贪心算法是一种优化策略,它在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的。这种算法通常用于解决复杂问题,通过局部最优解逐步逼近全局最优解。贪心算法并不...
**贪心算法与旅行商问题(TSP)** 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。它并不考虑整个问题的全局最优解,而是每一步都...
贪心算法和最小生成树 贪心算法是指在解决问题时,总是做出在当前看来最好的选择,以期望能够得到最终的最优解。贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。虽然贪心算法不能对...
### 贪心算法找零钱 #### 一、引言 在计算机科学与数学领域,贪心算法是一种解决问题的方法,它通过选择当前看起来最佳的选项来构建全局最优解。本篇文章将详细介绍如何使用贪心算法解决找零钱问题,并通过C语言...
### 贪心算法在背包问题中的应用及C语言实现 #### 一、贪心算法简介 贪心算法是一种在每个步骤中都选择局部最优解的策略,希望通过一系列的局部最优选择来达到全局最优解的目的。它适用于某些特定的问题类型,在...
在TSP问题中,贪心算法可能会选择每次连接最近未访问的城市,但这种策略并不总是能得出最优解,因为贪心算法没有考虑到全局的最优路径规划。 在VC++环境下,实现TSP问题的贪心算法通常涉及以下步骤: 1. **数据...
贪心算法是一种优化策略,它在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的。在解决背包问题时,贪心算法的应用尤为常见,尤其是对于部分背包问题。 0-1背包问题是最基础...
贪心算法是数据结构和算法领域中的一种策略,它的核心思想是在每一步决策时都采取在当前状态下最好或最优(即最有利)的选择,希望通过这一系列局部最优的选择,最终达到全局最优的效果。在实验报告中,贪心算法被...
经典的贪心算法,实用加常用 贪心算法(Greedy Algorithm)是一种经典的算法,在程序设计中非常常用。贪心算法的思想是,在对问题求解时,总是作出在当前看来是最好的选择。也就是说,不从整体上加以考虑,它所作出...
贪心算法是计算机科学中解决问题的一种策略,它通过做出局部最优选择来逐步达到全局最优解。在部分背包问题中,这种策略尤其适用。部分背包问题是一个经典的优化问题,经常出现在运筹学、算法设计和分析中。在此问题...
贪心算法是计算机科学中解决问题的一种策略,它通过在每一步选择局部最优解来尝试达到全局最优解。在处理磁盘文件的存储问题时,贪心算法的应用旨在以最高效的方式组织文件,以减少磁盘读写的时间和空间消耗。本...
贪心算法是一种解决优化问题的策略,它在每一步选择中都采取在当前状态下最好或最优的选择,以期能得到全局最优解或近似最优解。 在本程序中,我们采用C语言实现了一个贪心算法来求解哈密顿回路的近似解。贪心算法...