贪心算法

blog 13 | 贪心算法作业总结

流过昼夜 提交于 2019-12-05 12:13:17
第四章 贪心算法 总结 一、对贪心算法的理解: 贪心算法只关注当前状态,每次做出的决定均不会对之前的结果产生影响,并且没并不是所有问题都能用贪心算法得到最优解。 选择的贪心策略必须具有无后效性,即当前选择的结果必须不能对之前的结果状态产生影响,而只与当前状态有关。 二、请说明汽车加油问题的贪心选择性质: 汽车每次是否能往前行驶,取决于当前的油量,油量够就行驶,不够就加油,此时当前问题的解不需要考虑之前加油次数。 三、请说明在本章学习过程中遇到的问题及结对编程的情况: 1、对于证明贪心选择可行上花了一定的功夫。 2、结对编程步调一致,锻炼了我看并迅速解读他人代码的能力。 一、对贪心算法的理解: 贪心算法只关注当前状态,每次做出的决定均不会对之前的结果产生影响,并且没并不是所有问题都能用贪心算法得到最优解。 选择的贪心策略必须具有无后效性,即当前选择的结果必须不能对之前的结果状态产生影响,而只与当前状态有关。 二、请说明汽车加油问题的贪心选择性质: 汽车每次是否能往前行驶,取决于当前的油量,油量够就行驶,不够就加油,此时当前问题的解不需要考虑之前加油次数。 三、请说明在本章学习过程中遇到的问题及结对编程的情况: 1、对于证明贪心选择可行上花了一定的功夫。 2、结对编程步调一致,锻炼了我看并迅速解读他人代码的能力。 来源: https://www.cnblogs.com/gzq18/p

算法第四章作业

谁说我不能喝 提交于 2019-12-05 12:08:52
一、我对贪心算法的理解 贪心算法总是做出在当前看来是最好的选择,并不从整体最优上加以考虑,他所做出的选择只是在某种意义上的局部最优选择。虽然贪心算法不是对所有问题都能得到整体最优解,但对范围相当广的许多问题,他能产生整体最优解。 基本要素:   1.贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择来达到。贪心算法所做的贪心选择可以依赖于以往所做过的选择,但决不依赖于将来所做的选择,也不依赖于子问题的解。贪心算法通常以自顶向下的方式进行,以迭代的方式做出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。   2.最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。 今典问题:活动安排问题,背包问题,哈夫曼编码,最小生成树 二、汽车加油问题的贪心选择性质 贪心选择:最远能到达的地方的前一个加油站,不断这样选择,直到到达目的地;如果是其刚才所在的加油站,表示无法到达目的地,输出“No Solution!” 三、遇到的问题及结对编程的情况   1.问题:哈夫曼编码的前缀码的二叉树有点难理解   2.结对编程情况:在课上齐心协力把前两道题做出来了,课后把第三题做出来了,课上在第二题那里在Dev C++上所有情况考虑进去,运行出来的是正确答案。但是在PTA上就是后面有一个答案错误,很疑惑。最后找呀找,同伴找到了了问题

算法第四章作业

寵の児 提交于 2019-12-05 11:58:37
你对贪心算法的理解 请说明汽车加油问题的贪心选择性质 请说明在本章学习过程中遇到的问题及结对编程的情况 一、贪心算法的理解   选择一个 贪心策略 并在解决每一步子问题的时候都遵循该策略找到 当前情况的最优解 而不需要考虑这样的做法 否能得到整体最优解 (即贪心策略不是对所有问题都能得到整体最优解)。 二、请说明汽车加油问题的贪心选择性质   汽车加油的贪心选择策略是:“最远能到达”。即一次加油最远能到达第N个加油站,而刚好不能够到达第N+1个加油站,那么在当前的解就选择前往第N个加油站。   核心代码演示: 1 for (int i = 0; i < station + 1; ++i) { 2 if(a[i] <= gas) { //先不加油 3 gas -= a[i]; 4 } 5 else if(a[i] <= full) {//加油再试试 6 gas = full; 7 gas -= a[i]; 8 destination++; 9 } 10 else { //实在不行了就break 11 destination = -1; 12 break; 13 } 14 } 三、请说明在本章学习过程中遇到的问题及结对编程的情况   本章学习过程中遇到的最大的问题就是在决定贪心选择策略的时候需要考虑很多方面, 不是随便一个贪心策略都能使用 的,就像选点问题

贪心算法,寻找“最美”,我全都要!

不羁的心 提交于 2019-12-05 11:36:52
寻找“最美”,贪心算法,我全都要 ——算法第四章总结 软三 杨伟耿 20181003083 一、 以小见大,贪心策略 贪心算法总是做出在当前看来是最好的选择,贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优,当然我们也希望得到的最终结果也是整体最优的。在我看来,就是一个找“最”的过程,比如按最大排序、最小排序、平均最大等等。解体思路大致是,先寻找一个“最”,然后思考能否找出反例来推翻这个“最”,有反例的话就重新找“最”,直到可以通过反证法等证明该“最”是最优选择,且不存在反例。 汽车加油问题: 汽车加油问题 (15 分 ) 题目来源:王晓东《算法设计与分析》 一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。 输入格式: 第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。 输出格式: 输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。 输入样例: 7 7 1 2 3 4 5 1 6 6 输出样例: 4 贪心选择性质

算法第四章作业-贪心算法

此生再无相见时 提交于 2019-12-05 11:31:56
一、对贪心算法的理解    贪心算法总是做出在当前看来是最好的选择,它不依赖于将来所做的选择,也不依赖于子问题的解,它并不从整体最优考虑,它所做的选择只是局部最优解,这就是贪心算法和动态规划的区别,而且,相较于动态规划算法,贪心算法更加简单,效率也更高。   贪心算法有两个基本要素:贪心选择性质和最优子结构性质。贪心选择性质是指每次做出的贪心选择最终会导致问题的整体最优解。最优子结构则是指一个问题的最优解一定包含其子问题的最优解 。 二、汽车加油问题       贪心选择策略:若汽车所剩余的汽油可以开到下一站,就不加油。   以下是部分算法代码: 1 void MinPetrolStation(int *a, int n, int k) { 2 int temp = n; 3 int count = 0; 4 for (int i = 1; i <= k + 1; i++) { 5 temp -= a[i]; 6 if (i == k + 1 && temp >= 0) { 7 cout << count << endl; 8 } 9 else if (temp >= 0 && temp - a[i + 1] < 0) { 10 count++; 11 temp = n; 12 } 13 } 14 if (temp < 0) 15 cout << "No Solution!" <<

删数问题-贪心

限于喜欢 提交于 2019-12-05 10:55:18
题目: 键盘输入一个高精度的正整数 N (不超过 250 位) ,去 掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的正整数。 编程对给定的 N 和 k ,寻找一种方案使得剩下的数字组成的新数最小。 算法思路: 要从正整数中删除k个数字,可以采取一步步来删的策略,每一次删除一个数字,使得当前得到的数字是最小的,执行k步后,即得到最后的结果。 通过子问题的最优解来得到整个问题的最优解,就是贪心的思想。 例如:7122145这个数字,如果k=3,第一次删除的应该是7,得到122145;第二次删除的应该是5,得到12214;第三次删除的应该是4,得到1221. 通过观察,可以发现每次删除的数字有这样的规律: 都是整个数字中递减区间的第一个数字,如果整个数中没有递减区间,就删除最后一个数字,因为要想留下的数字最小,它的高位肯定要尽可能小, 这样删除的方法,在当前次看来都是最优的,我们把降序区间的第一个数删掉,就可以让后面比他小的数前进一个高位,那么数字也就变小了, 如果我们删除了这个最优数字前面的数,那么这个比较大的数字就前进了一个高位,反而让数字变大了, 同样的,如果我们删除这个数后面的也很大的数字,虽然能让小的数也前进一个高位,但是它本身处的位置也很低,显然没有让利益最大化。 上代码: 1 #include<iostream> 2 #include<string> 3

算法第四章作业

一个人想着一个人 提交于 2019-12-05 09:48:27
    算法第四章作业   1. 你对贪心算法的理解 贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。而不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。并不是所有的问题都可以用贪心的思想解决,对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最优解。   2.请说明汽车加油问题的贪心选择性质 如果能跑到下一个站则不加油,只有当油不够的时候再加油。   3.请说明在本章学习过程中遇到的问题及结对编程的情况 涉及会场安排的问题的时候通常有两个时间要记录,这个时候可以使用结构体方便记录。排序什么的也可以一次过搞完。还有有时候要想想贪心的思想行不行得通,比如删数问题,总想着删掉最大的数的话可能会有错误。结队编程过程和同伴一起讨论的问题,思考如何解决,同时和看了他的代码,听他讲解了思路。 来源: https://www.cnblogs.com/tinyea/p/11919802.html

第四章作业和学习总结

北慕城南 提交于 2019-12-05 09:36:34
引论:贪心算法作为算法学习中的一种重要思想,其重要性和实用性不言而喻。在解决实际问题中,贪心算法总能引领我们得出问题的最优解,而它由于动态规划算法不同,它是通过贪心选择性质和最优子结构性质确定解法,然后自顶而下解决问题,下面分享我对第四章——贪心算法的学习心得。 一、对贪心算法算法的理解 首先我们要知道,贪心算法并不是从整体最优上加以考虑的,它所做的选择只是在某种意义上的局部最优选择。但是,若所求问题的整体最优解可以通过一系列局部最优解得到,那么我们就可以以迭代的方式将所求问题简化为问题规模更小的子问题,那么贪心算法就能有效地解决问题。使用贪心算法,要求我们:1. 首先找到合理的贪心策略,即如何选择来实现得到最优解的情况。 2. 列出一系列贪心选择策略后,一个个证明其可行性,最后通过证明得出可行的贪心选择策略。 3. 利用得出的贪心选择策略来解决当前的子问题。 4. 由于整体问题的最优解包含每个子问题的最优解,所以最后能够得出整体问题的最优解。 二、以作业题为例子分析贪心算法 问题事例: 问题分析:首先,汽车想要使沿途的加油次数最少,则需要最大利用汽车每次加了的油。每次我们先分析加满油的汽车能走n公里,结合每个加油站的距离,即能得到每次加满油能够经过的加油站次数。题目要求要得到达到目的地的最少加油次数,那么我们可以求出每次加油的能经过的加油站,并在最后一个加油站加油

贪心算法(会场安排问题、区间选点)

淺唱寂寞╮ 提交于 2019-12-05 09:18:20
学习算法课程之后的第一次记录,渐渐的,程序设计考虑的因素增多,程序=数据结构+算法,这个等式让我深有体会。从开始简单的C++编程,再到选择合适数据结构,现在需要更进一步,从算法层次上考虑程序执行的效率。我对算法的理解是用更少的开销获得更优的执行效果。 分治法、动态规划在此之前没有记录下来,学到贪心算法的时候,觉得需要总结一下学过的东西,也能更好的理解。动态规划的设计,要满足最优子结构性质和重叠子问题,采用自底向上的策略,计算出最优值,找到整体最优解。这个过程有时候挺难的,主要在写出递归式,要自底向上填表。贪心策略有点像动态规划,但在一些方面是不同的,有时候贪心算法的思想更容易想到。它要满足子问题最优而得到整体最优?两个条件:最优子结构性质和贪心选择性质。满足贪心选择性质一定满足最优子结构性质,而满足最优子结构性质不一定满足贪心选择性质, 比如背包问题可以用贪心算法解决,而0-1背包问题只能用动态规划。 典型的贪心问题活动安排,有n个活动,给出开始时间和结束时间,要尽可能安排多的活动(时间互相不冲突)。解决这个问题正确的贪心思想是以每个活动结束时间为比较变量,按结束时间升序排好活动次序,接着就进行比较选择。而会场安排问题与活动又有些不同之处,下面是我的解题过程。 7-2 会场安排问题 (20 分) 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的

贪心算法

痞子三分冷 提交于 2019-12-05 09:18:16
一.对贪心算法的理解 贪心算法所做的每个选择都是当前状态下最好的选择,可以依赖以往所做的选择,但不依赖将来做的选择,也不依赖子问题的解。它并不从整体最优上加以考虑,故贪心算法并不是总能得到整体最优解,但有些问题相比于动态规划算法,使用贪心算法会更简单且效率更高,比如找零钱问题等。 可以用贪心选择算法解决的问题一般有两个性质:贪心选择性质和最优子结构性质。贪心选择性质即每步所做的贪心选择最终导致问题的最优解;最优子结构性质即该问题的最优解包含其子问题的最优解。 运用贪心算法时最关键的是贪心策略的选择,比如会场安排问题,若只有一个会场要尽可能安排多的活动,则贪心策略是每次根据最早结束时间安排活动,若要安排尽可能少的会场来安排全部活动,则贪心策略是每次根据最早开始时间安排活动。所以贪心策略的选择很重要。 二.汽车加油问题的贪心选择性质 题目:一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。 输入:第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。 输出:最少加油次数。如果无法到达目的地,则输出“No