数据结构与算法之贪心算法 C++实现

1、基本思路:从问题的某一个初始解触发逐步逼近给定的目标,以尽可能快的求得更好的解。当达到算法中某一步不能再继续前进时,就停止算法,给出近似值。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

存在的问题:

1、不能保证最后的解是最优的;

2、不能用来求最大或最小解的问题;

3、只能求满足某些约束条件的可行解的范围。

实现过程:

从问题的某一初始解出发;

while (能朝给定总目标前进一步)

{

利用可行的决策,求出可行解的一个解元素;

}

由所有解元素组合成问题的一个可行解;

贪心算法的基本要素:(对于一个具体的问题,怎么知道是否可用贪心算法解此问题)

(1)、贪心选择性质

所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,换句话说,当考虑做何种选择的时候,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。这是贪心算法可行的第一个基本要素。

对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

(2)、最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。

实例:换零钱

人民币100、50、20、10、5、1、0.5、0.2、01多种纸币。将一定数额的钱数用不能面额组合起来。

代码:

#include<iostream>
const int SIZE = 9;
int coin[SIZE] = {10000, 5000, 2000, 1000, 500, 100, 50, 20, 10};
int num[SIZE];
int exchange(int n);
int main()
{
    using namespace std;
    double money;
    string name[SIZE] = {"一百元", "五十元", "二十元", "十元", "5元", "1元", "5角", "2角", "1角"};
    cout << "请输入金额:";
    cin >> money;
    int n = (int)(money*100);
    exchange(n);
    for(int i=0; i<SIZE; i++)
    {
        cout << name[i] << "币种: " << num[i] << " 张\n";
    }
    return 0;
}
int exchange(int n)
{
   int i;
    for (i=0; i<SIZE; i++)
        if (n >= coin[i]) break;
    while (n>0 && i<SIZE)
    {
        if(n >= coin[i])
        {
            n -= coin[i];
            num[i]++;
        }else if(n<10 && n>=5)
        {
            num[SIZE-1]++;
            break;
        }else i++;
    }
    return 0;
}

运行结果:

时间: 2024-10-10 04:02:54

数据结构与算法之贪心算法 C++实现的相关文章

五大算法思想—贪心算法

贪心法理解 贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优. 一句话:不求最优,只求可行解. 判断贪心法 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解? 我们可以根据贪心法的2个重要的性质去证明:贪心选择性质和最优子结构性质. 1.贪心选择性质 什么叫贪心选择?从字义上就是贪心也就是目光短线,贪图眼前利益,在

算法导论--贪心算法与动态规划(活动选择问题)

活动选择问题 有一个教室,而当天有多个活动,活动时间表如下:找出最大兼容活动集!活动已按结束时间升序排序. 动态规划 采用动态规划需要满足两个条件:1.最优子结构2.子问题重叠 令Sij表示在ai结束后和aj开始前活动的集合,假定Aij为活动集合Sij的最大兼容子集,其中包含活动ak.问题变成求Sik与Skj最大兼容活动子集Aik与Akjz.我们用c[i,j]表示Sij的最优解的大小. 则c[i,j] = c[i,k]+c[k,j]+1;最后我们需要遍历所有可能的k值,找出最大的一个划分作为c[

数据结构与算法简记--贪心算法

贪心算法 贪心算法问题解决步骤 第一步,当我们看到这类问题的时候,首先要联想到贪心算法:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大. 第二步,我们尝试看下这个问题是否可以用贪心算法解决:每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据. 第三步,我们举几个例子看下贪心算法产生的结果是否是最优的. 贪心算法实战分析 分糖果:有 m 个糖果和 n 个孩子.要把糖果分给这些孩子吃,但是糖果少,孩子多(m<n),所以糖果只能分配

五大常用算法之三贪心算法

贪心算法 贪心算法简介: 贪心算法是指:在每一步求解的步骤中,它要求"贪婪"的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解. 贪心算法每一步必须满足一下条件: 1.可行的:即它必须满足问题的约束. 2.局部最优:他是当前步骤中所有可行选择中最佳的局部选择. 3.不可取消:即选择一旦做出,在算法的后面步骤就不可改变了. 贪心算法案例: 1.活动选择问题  这是<算法导论>上的例子,也是一个非常经典的问题.有n个需要在同一天使用同一个教室的活动a

算法导论----贪心算法,删除k个数,使剩下的数字最小

先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4,要求的最小数字b是n-k=6位的: 1.先找最高位的数,因为是6位数字,所以最高位不可能在后5位上取到(因为数字的相对顺序是不能改变的,假设如果取了后五位中倒数第5位的7,则所求的b就不可能是6位的了,最多也就是4位的79228)理解这点很重要!所以问题变成从第1位到第k+1(n-(n-k-1))取

[算法导论]贪心算法(greedy algorithm)

转载请注明出处:http://www.cnblogs.com/StartoverX/p/4611544.html 贪心算法在每一步都做出当时看起来最佳的选择.也就是说,它总是做出局部最优的选择,寄希望(证明)这样的选择能够导致全局最优解. 贪心算法和动态规划都依赖于最优子结构,也就是一个问题的最优解包含其子问题的最优解.不同的是,动态规划通常需要求解每一个子问题,通过对所有子问题的求解得到最终问题的解.而贪心算法寄希望于通过贪心选择来改进最优子结构,使得每次选择后只留下一个子问题,大大简化了问题

【经典算法】贪心算法

贪心算法分阶段工作.在每一个阶段,可以认为所做的决定是好的,而不考虑将来的后果.一般来说,这意味着选择的是某个局部最优.这种“眼下能够拿到的就拿”的策略是这类算法名称的来源.当算法终止时,我们希望局部最优就是全局最优.如果真是这样的话,那么算法就是正确的:否则,算法得到的是一个次最优解.如果不要求绝对的最佳答案,那么有时用简单的贪心算法生成近似答案,而不是使用一般来说产生准确答案所需要的复杂算法. 可以根据如下步骤来设计贪心算法: 1. 将优化问题转化成这样的一个问题,即像做出选择,再解决剩下的

简单理解算法篇--贪心算法

贪心算法是什么意思?举个例子就很清楚了:现在你有一个能装4斤苹果的袋子,苹果有两种,一种3斤一个,一种2斤一个,怎么装才能得到最多苹果?当然我们人考虑的话当然是拿两个2斤的苹果,就刚好装满了,但是如果按贪心算法拿的话,首先就要把最重的苹果拿下(是不是很符合贪心两个字?),但并没有得到最多苹果. 贪心算法保证了局部最优,但并不能保证得到最优解. 什么时候用贪心法?满足下面两个条件 1.       具有最优子结构 2.       贪心选择性 第1点跟动态规划的条件一样,其实贪心跟动态规划一样,都

基本算法之贪心算法

看了刘汝佳大牛的黑书果然很有体会,虽然很难,但是真的题题经典,一定要坚持坐下去,下面我们来说说贪心法 贪心算法即是每次选择局部最优策略进行实施,而不去考虑对今后的影响.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关. 下面来看一个题目: POJ1042 钓鱼(黑书) 链接:http://poj.org/problem?id=1042 贪心:为了不讨论在路上花费的时间,可以枚举到过的湖:比如: