精华内容
下载资源
问答
  • 本实验选择【-1背包问题】,请用贪心算法求解(贪心策略的选择是关键)。 问题如下:有一个背包,背包容量是150kg。现有8个物品,物品大小固定,即不可分割。 要求:尽可能让装入背包中的物品总价值最大,但前提条件是...
  • 该程序C语言编写(在VC++环境下运行即可),使用贪心算法求得最短哈密顿回路的近似解,简单易懂。 该程序C语言编写(在VC++环境下运行即可),使用贪心算法求得最短哈密顿回路的近似解,简单易懂。
  • 福建工程学院计算机与信息科学系 实验报告 1 2 3 4 5 篇二北邮算法作业贪心算法实验报告 第三次算法作业贪心算法 姓名吴迪 班级08211312 学号08211488 班内序号 15 摘要本文为完成作业problem1problem3problem4...
  • 使用贪心算法解决多重背包问题(物体可拆分)的具体C++代码
  • 主要介绍了Python贪心算法,结合三个常见实例分析了贪心算法的原理及解决具体问题的相关使用技巧,需要的朋友可以参考下
  • 贪心算法

    千次阅读 多人点赞 2019-04-07 15:16:00
    贪心算法贪心算法的定义贪心算法解决问题算法流程 贪心算法的定义 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上...

    贪心算法的定义

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

    贪心算法解决问题

    (1)你有n堆石头质量分别为W1,W2,W3…Wn.(n<=100000)现在需要你将两堆石头合并,问一共所用力量最小是多少?
    例如:
    n=4;
    3,1,7,5;
    解题思路:每次挑重量最少的两堆石头,直到所有石头挑完。
    如例题,先将三堆石头按照重量从小到大排序为:1,3,5,7。第一次所用最小力量为1+3=4;然后将4,5,7按从小到大排序,第二次所用最小力量为4+5=9;然后将9,7按从小到大排序,为7,9,第三次所用最小力量为7+9=16;所以一共所用最小力量:4+9+16=29.

    #include<stdio.h>
    typedef struct stone
    {
        int num;
    }Stone;
    Stone st[100];
    void sort(int start_flag,int n)//对n堆石头质量按照从小到大的顺序排序
    {
        int i,j;
        Stone temp;
        for(i=start_flag;i<n-1;i++)
            for(j=start_flag;j<n-1-i;j++)
            if(st[j].num>st[j+1].num)
        {
            temp=st[j];
            st[j]=st[j+1];
            st[j+1]=temp;
        }
    }
    void main()
    {
        int n,i,count=0,start_flag=0;
        printf("输入石头堆数:");
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d",&st[i].num);
        for(i=start_flag;i<n-1;i++)
        {
            sort(start_flag,n);
            st[i+1].num+=st[i].num;
            count+=st[i+1].num;
            start_flag++;
        }
        printf("一共所用最少力量%d \n",count);
    }
    

    (2)公司的会议室每天都会有许多会议,有时这些会议的计划时间会发生冲突,需要选择出一些会议。小刘的工作就是安排公司会议室的会议,每个时间最多安排一个会议。现在小刘有一些会议计划的时间表,他想尽可能的安排更多的会议,请问他该如何安排。
    输入
    第一行输入一个整数n(1<n<10000)表示该测试数据共有n个活动。
    随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)
    输出
    输出最多能够安排的会议数量,以及哪些会议被安排。
    样例输入
    3
    1 10
    10 11
    11 20
    样例输出
    最多能够安排的会议数量:2
    安排的会议分别为:
    第1个会议.第3个会议.

    #include<stdio.h>
    typedef struct meet
    {
        int begin;
        int end;
        int flag;
    
    } Meet;
    Meet mt[10000];
    void sort(int n)//根据每场会议的结束时间排序
    {
        int i,j;
        Meet temp;
        for(i=0; i<n-1; i++)
            for(j=0; j<n-1-i; j++)
                if(mt[j].end>mt[j+1].end)
                {
                    temp=mt[j];
                    mt[j]=mt[j+1];
                    mt[j+1]=temp;
                }
    }
    void main()
    {
        int n,i,j,count=1;
        printf("输入会议数:");
        scanf("%d",&n);
        for(i=0; i<n; i++)
            scanf("%d %d",&mt[i].begin,&mt[i].end);
        sort(n);
        i=0;
        mt[0].flag=1;
        for(j=1; j<n; j++)
        {
            if(mt[j].begin>mt[i].end)
            {
                mt[j].flag=1;
                count++;
                i++;
            }
        }
        printf("\n最多能够安排的会议数量:%d \n",count);
        printf("安排的会议分别为:\n");
        for(i=0; i<n; i++)
            if(mt[i].flag==1)
                printf("第%d个会议.",i+1);
    }
    
    

    算法流程

    Created with Raphaël 2.2.0 开始 找到贪心的点,按贪心的点排序 可选择? 结束 yes no
    展开全文
  • 主要介绍了Python基于贪心算法解决背包问题,简单描述了贪心算法的概念、原理并结合实例形式分析了Python使用贪心算法解决背包问题的具体操作技巧,需要的朋友可以参考下
  • 贪心算法汽车加油问题 贪心算法基本思想 贪心算法总是做出在当前看来是最好的选择并不会从总体去最优考虑虽然贪心算法不会对所有问题找到最优但是有时候会得到最优解的近似解 贪心算法的基本要素 1贪心选择性质指所...
  • 贪心算法 code

    2017-11-14 11:05:56
    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
  • 贪心算法总结

    2018-11-27 20:40:30
    贪婪算法基本知识的个人总结整理,包括定义、基本要素、基本思路、算法特性、经典例题等。
  • 贪心算法python实现

    2018-04-10 16:12:15
    机器学习实习生面试常考的算法——贪心算法, python代码实现,案例+PPT讲解
  • 算法这门课程的结课论文,以最短路径算法为例描述贪心算法
  • 贪心算法之背包问题

    2018-10-31 17:03:09
    贪心问题中有很多典型的例子,此次背包问题,助大家理解该算法
  • 贪心算法例子

    2016-12-07 13:51:45
    贪心算法经典例子
  • NULL 博文链接:https://chaozhichen.iteye.com/blog/716383
  • 基于贪心算法的最优装在你问题
  • C++贪心算法超市找零问题代码实现,分享给大家参考一下。
  • java贪心算法实验报告

    2018-12-10 22:59:25
    java贪心算法实验报告,有代码以及运行结果和总结等。
  • 多机调度问题的贪心算法实现。示例代码,可直接在VC上运行。
  • 用贪心算法求解最优服务次序问题,有具体的算法分析,贪心性质的证明,最优子结构的证明,及源代码
  • 20 组员: 王丹 魏蕾 魏晓卡 李丹 背包问题的贪心算法 * 1 问题描述 内容提要 2 3 实验及结果 4 实验总结 算法思想及分析 * 已知有n种物品和一个可容纳c重量的背包每种物品i的重量为wi假定物品i的一部分放入背包会...
  • python 贪心算法的实现

    2020-12-16 22:01:14
    贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解...
  • 贪心算法之最优合并问题.zip
  • 贪心算法之磁盘文件最有储存,注释详细,python文件,pycharm打开就能 贪心算法之磁盘文件最有储存,注释详细,python文件,pycharm打开就能 贪心算法之磁盘文件最有储存,注释详细,python文件,pycharm...
  • 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个0,1串表示各字符的最优表示方式。资源为哈夫曼编码可执行文件
  • 今天来学习贪心算法(greedy algorithm)。贪心算法有很多经典的应用,比如霍夫曼编码(Huffman Coding)、Prim 和 Kruskal最小生成树算法、还有 Dijkstra 单源最短路径算法。最小生成树算法和最短路径算法我们后面...

    ------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------

    今天来学习贪心算法(greedy algorithm)。贪心算法有很多经典的应用,比如霍夫曼编码(Huffman Coding)、Prim 和 Kruskal最小生成树算法、还有 Dijkstra 单源最短路径算法。最小生成树算法和最短路径算法我们后面会讲到。今天来看下,霍夫曼编码,它是如何利用贪心算法来实现对数据压缩编码,有效节省数据存储空间的

    如何理解“贪心算法”

    先看一个例子,假设我们有一个可以容纳100kg物品的背包,可以装各种物品。我们有以下5种豆子,相差总量和总价如下图。为了让背包中所装物品总价最大,我们如何选择在背包中装哪些豆子?每种豆子双该装多少?
    在这里插入图片描述

    这个很多简单,现实中你也会这么做,算出单价后,装单价最高的。也就是往背包里装20kg黑豆、30kg绿豆、50kg红豆。

    这个总量的解决思路显而易见,它本质上借助贪心算法。结合这个例子,我总结一下贪心算法解决总量的步骤。

    第一步,当我们看到这类问题的时候,首先要联想到贪心算法:会对一组数据,我们定义限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。

    类比刚刚的例子,限制值就是重量不超过100kg,期望值就是物品的总价值。这级数据就是5 种豆子。我们从中选出一部分,满足重量不超过100kg,并且价值最大。

    第二步,我们尝试看下这个问题是否可以用贪心算法解决:每次选择当前情况下,在对限制值同等贡献情况下,对期望值贡献最大的数据。

    类比刚刚的例子,我们每次从剩下的豆子里面,选择单价最高的,也就是重量相同的情况下,对价值贡献最大的豆子。

    第三步,我们举几个例子看下贪心算法产生的结果是否是最优的。大部分情况下,举几个例子验证一下就可以了。严格地证明贪心算法的正确性,是非常复杂的,需要涉及较多的数学推理。而且,从实践角度来说,大部分能用贪心算法解决的问题,贪心算法的正确性都是显而易见的,也不需要严格的数学推导证明。

    实际上,用贪心算法解决问题的思路,并不总能给出最优解。

    如下图,我们从顶点S开始,找一条到顶点T的最短路径。贪心算法来找的话,就是S->A->E->T,路径长度是9。在这里插入图片描述

    但实际上,最优路径是S->B->D->T,路径长度是6。为什么贪心算法在这个问题上不工作了呢?

    这是因为前面的选择,会影响后面的选择。如果第一步从S到A,那接下来面对的顶点和边,跟第一步从顶点S到B,是完全不同的。

    贪心算法实战分析

    对于贪心算法,如果死抠的话,确实很难理解透彻。掌握贪心算法的关键是多练习。只要多练习几道题,自然就有感觉了。所以,带着你分析几个具体的例子。

    1、分糖果

    我们有 m 个糖果和 n 个孩子。糖果少,孩子多,怎么把糖果分配给孩子。

    每个糖果的大小不等,这 m 个糖果大小分别是 s1, s2, s3, … , sm。除此之外,每个孩子对糖果大小的需要也不一样,假设这 n 个孩子对糖果大小的需要分别是g1, g2, g3, … ,gn。

    我的问题是,如何分配糖果,能满足最多数量的孩子?

    我们每次从的孩子中,找出对糖果大小需要最小的,然后在剩余的糖果中,找到能满足他的最小的糖果,分给他之后,重复这样的操作。

    2、钱币找零

    这个问题在我们日常生活中更加普遍。假设我们有1元、2元、5元、10元、20元、50元、100元这些面额的纸币。它们的张数分别是c1、c2、c5、c10、c20、c50、c100。我们现在要用这些钱来支付K元,最少要用多少张纸币呢?

    在生活中,我们肯定是先用面值最大的来支付,即先用一张小于K元的最大面值,然后再选一张小于未支付总额的最大面值,依次选下去。

    3、区间覆盖

    假设我们有 n 个区间,区间的起始端点和结束端点分别是[l1, r1],[l2, r2],[l3, r3], … ,[ln, rn]。我们从这些区间中选出一部分区间,满足任何区间不重合(端点重合的情况不算),最多能选出多少区间呢?在这里插入图片描述

    这个问题的处理思路稍微不是好么好懂。但是这个处理思想在很多贪心算法问题中都有用到,比如任务调试、教师排课等等问题。

    第一步,在所有区间中,找出右侧端点最小的那个区间,并且把与此区间有重合的区间删除。第二步,在剩余区间中找出右侧端点最小的那个区间,并且删除与此区间有重合的区间。重复步骤二。在这里插入图片描述

    解答开篇

    如何用贪心算法实现霍夫曼编码?假设我人一个包含1000个字符的文件,每个字符占1个byte(1byte=8bits),存储这1000字符就一共需要8000bits,那有没有更加节省空间的存储方式呢?

    假设我们分析发现,这1000个字符中只包含6种不同字符,假设它们分别是a, b, c, d, e, f。而3个二进制位(bit)就可以表示8种不同的字符,所以,为了尽量减少存储空间,每个字符我们用3个二进制来表示。那存储这1000个字符只需要3000bits就可以了。不过,还有没有更加节省空间的存储方式呢?

    a(000)、b(001)、c(010)、d(011)、e(100)、f(101)

    霍夫曼编码要全场了,它广泛用于数据压缩,其压缩率通常在20%~90%之间。

    霍夫曼验证码不仅会考察文本中有多少个不同字符,还会考察每个字符出现的频率,根据频率的不同,选择不同长度的编码。霍夫曼编码试图用这种不等长的编码方法,来进一步增加压缩的效率。如何给不同频率的字符选择不同长度的编码呢?根据贪心思想,我们可以把出现频率比较多的字符,用稍微短一些的编码,出现频率比较少的字符,用稍微长一些的编码。

    对于等长的编码来说,我们解压缩很简单。比如刚才那个例子中,我们用3个bit表示一个字符。在解压的时候,我们每次从文本中读取3位二进制码,然后翻译成对应的字符。但是,霍夫曼编码是不等长的,每次应该读取1位还是2位、3位等等来解压缩的呢?这个问题就导致霍夫曼编码解压缩来比较复杂。为了避免解压缩过程中的歧义,霍夫曼要求各个字符的编码之间,不会出现某个编码是另一个编码前缀的情况。

    在这里插入图片描述

    假设这6个字符出现的频率从高到低依次是a、b、c、d、e、f。我们把它们编码下面这个样子,任何一个字符的编码都不是另一个的前缀,在解压缩的时候,我们每次会读取尽可能长的可解压的二进制,所以在解压的时候,也不会有歧义。经过这各编码压缩之后,这1000个字符,只需要2100bits就可以了。在这里插入图片描述

    尽管霍夫曼编码的思想并不难理解,但是根据字符出现频率的不同,给不同的字符进行不同长度的编码呢?这里的处理稍微有些技巧。

    我们每个字符看作一个节点,并且辅带看把频率放到优先级队列中。我们从队列中取出频率最小的两个节点A、B,然后新那一个节点C,把频率设置为两个节点的频率之和,并把这个新节点C作为节点A、B的父节点。最后两把C节点放到优先级队列中。重复这个过程,直到队列中没有了数据。
    在这里插入图片描述

    现在,给每一条边画一个权值,指向左子节点的边我们统统标记为0,指向右子节点的过,我们统统标记为1,那从根节点到叶子节点的路径就是叶子节点对应字符的霍夫曼编码。
    在这里插入图片描述

    内容小结

    实际上贪心算法适用的场景比较有限,这种算法思想更多的是指导设计基础算法。比如最小生成树算法、单源最短路径算法,这些算法都用到了贪心算法。从我个人学习经验来讲,还要刻意去记忆贪心算法的原理,多练习才是最有效的学习方法

    贪心算法的最难的一块是如何将要解决的问题抽象成贪心算法模型,只要这一步搞定之后,贪心算法的编码一般都很简单。贪心算法解决疸的正确性虽然很多时候看起来是显而易见的,但是要严谨地证明算法能够得到最优解,并不是件容易的事。所以,很多时候,我们只需要多举几个例子,看一下贪心算法的解决方案是否真的能得到最优解就可以了。

    展开全文
  • 贪心算法的实验报告 PAGE PAGE 1 作者 日期 PAGE / NUMPAGES 福建工程学院计算机与信息科学系 实验报告 2012 2013 学年第 一 学期 任课老师 章静 课程名称 结构化程序设计 班级 座号 姓名 实验题目 实验2 贪心算法...
  • 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是...
  • 设有n个活动的集合S={a1,a2,...an},和m个资源的集合R={r1,r2,...rm},希望最少的资源来安排所有的活动。求需要的资源数目及活动分配方案。 一次遍历活动,即可实现对资源的分配,当出现一个活动就放入相应资源中。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,562
精华内容 42,624
关键字:

什么时候用贪心算法