贪心算法

贪心算法的例子

ぐ巨炮叔叔 提交于 2019-11-26 20:46:06
贪心算法 写这篇博文的目的是因为对于贪心算法一直没有很深的理解,每次都会因为贪心算法AC不了而头疼。 贪心的主要思想 总是选择“当前最好的选择”,而不从整体上去把握的思想。贪心算法在某种情况下的确能得到最优的结果。 例子1 FatMouse’ Trade 题目的大致意思是:m元钱,n种物品,每种物品j磅,总价值f元,可以使用0到f的任意价格购买相应磅的物品,例如使用0.3f元,可以购买0.3j磅物品。要求输出用m元钱最多能买到多少磅物品。 输入 : 输入m元,n种物品,后输入n种物品,以及每种物品对应的重量、总价值,输入-1,-1结束输入。 这题可以用贪心算法求解,对于剩余物品,每次都购买剩余物品中性价比(即重量/价格)最高的物品,直到该物品被买完,则我们继续在剩余的物品中寻找性价比最高的物品,重复该过程;若金钱耗尽,则交易结束。 下面证明是否能用贪心算法求得最优解 按照贪心算法的思想,如果存在性价比为a高的物品,那么原物品中性价比高于a的物品一定全部被我们买下来。采用反证法,假设,存在着性价比b>a的物品没有被买下来,但是我们获得了最优解,此时,如果退掉了a而去购买b,那么在同样的价钱下,b的重量会明显的大于a,也就是说a不是最优解。假设不成立,因此,按照贪心算法求得的是最优解。 下面上代码; #include < stdio . h > #include < algorithm

贪心算法之最小生成树

妖精的绣舞 提交于 2019-11-26 20:16:38
//program 2-6 #include <iostream> using namespace std; const int INF = 0x3fffffff; const int N = 100; bool s[N]; int closest[N]; int lowcost[N]; void Prim(int n, int u0, int c[N][N]) { //顶点个数n、开始顶点u0、带权邻接矩阵C[n][n] //如果s[i]=true,说明顶点i已加入最小生成树 //的顶点集合U;否则顶点i属于集合V-U //将最后的相关的最小权值传递到数组lowcost s[u0]=true; //初始时,集合中U只有一个元素,即顶点u0 int i; int j; for(i=1; i<=n; i++) { if(i!=u0) { lowcost[i]=c[u0][i]; closest[i]=u0; s[i]=false; } else lowcost[i]=0; } for(i=1; i<=n;i++) //在集合中V-u中寻找距离集合U最近的顶点t { int temp=INF; int t=u0; for(j=1;j<=n;j++) { if((!s[j])&&(lowcost[j]<temp)) { t=j; temp=lowcost[j]; } } if(t==u0

C. Planning(贪心)

Deadly 提交于 2019-11-26 17:55:32
C. Planning time limit per test 1 second memory limit per test 512 megabytes input standard input output standard output Helen works in Metropolis airport. She is responsible for creating a departure schedule. There are n flights that must depart today, the i -th of them is planned to depart at the i -th minute of the day. Metropolis airport is the main transport hub of Metropolia, so it is difficult to keep the schedule intact. This is exactly the case today: because of technical issues, no flights were able to depart during the first k minutes of the day, so now the new departure schedule

算法学习(二)贪心算法

♀尐吖头ヾ 提交于 2019-11-26 17:01:54
贪心算法 一、基本思想 所谓贪心算法是指,在对问题求解时,总是做出在 当前看来是最好的选择 。 也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的 局部最优解 。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即 某个状态以后的过程不会影响以前的状态,只与当前状态有关 。 最短路径问题( 广度优先搜索BFS、Dijkstra算法 )都属于贪婪算法,只是在其问题策略的选择上,刚好可以得到最优解。 所以对所采用的贪心策略一定要仔细分析其是否 满足无后效性。 二、基本步骤 建立数学模型来描述问题。 把求解的问题分成若干个子问题。 对每一子问题求解,得到子问题的局部最优解。 把子问题的解局部最优解合成原来解问题的一个解。 三、适用问题 贪心算法要求最优解问题可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,但大部分情况下这个前提是不存在的。 贪心算法和动态规划本质上是对子问题树的一种修剪,两种算法要求问题都具有的一个性质就是子问题最优性(组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的)。动态规划方法代表了这一类问题的一般解法,而贪心算法是动态规划方法的一个特例

贪心算法

天涯浪子 提交于 2019-11-26 13:10:17
贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 一、贪心算法的特点 1. 贪心选择 应用同一种规则,将原问题变为一个相似的但规模更小的子问题 2. 最优子结构 只有满足最优解包含局部最优解时,才能保证最终得到的结果是最优解 二、几个简单的贪心实例 1. 最优装载问题 贪心策略:先装最轻的 2. 部分背包问题 详见博客 贪心策略:先选出性价比高的 3. 乘船问题 贪心策略:最轻的人和最重的人配对 三、例题 来源: https://www.cnblogs.com/bingogyz/p/11321840.html

算法第四章作业

こ雲淡風輕ζ 提交于 2019-11-26 12:55:37
一、对贪心算法的理解 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 做贪心题,首先要猜想贪心策略,然后尝试证明策略的正确性。 二、汽车加油问题 有足够的汽油支持汽车开到下一个加油站,就不加油,反之加油,这样的贪心策略保证了加油次数尽可能少,让每次加油后汽车能跑得更远。 三、遇到的问题及结对编程情况 做题的时候想不到合适的算法就很尴尬,会卡住。 陷入思维旋涡的时候就要靠队友了,结伴编程的好处就体现了出来,最后也成功过题了。 来源: https://www.cnblogs.com/Remilia-Scarlet/p/11934706.html

第四章作业

浪子不回头ぞ 提交于 2019-11-26 00:45:17
一.我对贪心算法的理解: 贪心算法概念:贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。 所以由概念,可以说贪心算法不是从整体最优解上加以考虑,他所做的是在一些意义上的最优解,同时也不能保证对所有问题的整体都能取得最优解。 能不能取得最优解取决于他的贪心策略,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 贪心算法有两个基本要素 (1)贪心选择:贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。 (2)最优子结构:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。 二.汽车加油问题的贪心选择性质: 贪心选择:最远且能到达的加油站,这样一直选择则可到达目的地。 三.结对编程的情况 我和梁家铭同学配合默契,合作愉快,在解决问题的时候共同思考 同时我们还会更加努力学习,一起解决对我们来说尚为困难的问题。 来源: https://www.cnblogs.com/DreamGCdog/p/11932364.html