贪心算法

4.4 贪心

时光毁灭记忆、已成空白 提交于 2019-11-29 13:26:06
2019年9月PAT - 练习笔记——4.4 以下页码标注的是阅读器中实际页码,而不是书本身自印的页码。 第4章 入门篇(2)——算法初步 4.4 贪心 注意 注意输入输出样例不一定能反应题目要求的数据类型!见B1020 目录 B1023 组个最小数 B1020 / A1070 月饼 A1033 To Fill or Not to Fill A1037 Magic Coupon A1067 Sort with Swap(0, *) A1038 Recover the Smallest Number B1023 组个最小数 给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。 现给定数字,请编写程序输出能够组成的最小的数。 输入格式: 输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。 输出格式: 在一行中输出能够组成的最小的数。 输入样例: 2 2 0 0 0 3 0 0 1 0 输出样例: 10015558 我的 #include <iostream> #include

贪心算法:汽车加油问题

假装没事ソ 提交于 2019-11-29 10:29:13
1.试用贪心算法求解汽车加油问题:已知一辆汽车加满油后可行驶n公里,而旅途中有若干个加油站。试设计一个有效算法,指出应在哪些加油站停靠加油,使加油次数最少请写出该算法。 #include <iostream> #include <algorithm> #define M 100 using namespace std; /*加满油之后可行驶n公里, 对于给定的n和k个加油站位置,计算最少加油次数。 基本思路:经过加油站时如果汽车有油,且能到达下一个加油站, 就不加油,否则,加油 设定数组来记录经过加油站时是否加油*/ int main() { int station[M];//记录加油站之间的路程 int n;//汽车加满油后能行驶的里程 int k1;//加油站个数 int k[M];//记录是否加油 int lv;//油箱中的油可以走的距离 cout<<"输入加油站的数量:"; cin>>k1; cout<<"输入各个加油站之间的距离:"; for(int i=0;i<k1+1;i++)//共k+1段距离 { cin>>station[i]; } cout<<"输入加满油后可以走的距离"; cin>>n; lv=n; for(int i=0;i<k1;i++) { if(lv-station[i]<=station[i+1]) { k[i]=1; lv=n; } else {

第二天

江枫思渺然 提交于 2019-11-29 05:01:53
今天继续昨天的三组分别写了三道题,排序,字符串,还有一个是贪心。 排序用的是桶排序的思想。 就是定义一个数组,以数组下标作为排序的数字,数组内容为1就代表存在这个数,为0代表不存在。 而字符串,贪心并没有什么很难的,重要的是自己用了一些c++的库,感觉c++比c要方便一些。 明天再做一次这三组就可以完成了,这三组相对后面应该要简单些,希望赶快到后面,写一些难的算法题。自己也是感觉有强迫症似的,不把前面的组过完了,就不想做后面的组,加油!。希望我们能坚持下去,这是第二天了哦。 来源: https://www.cnblogs.com/ilwf/p/11455774.html

贪心算法及几个常用的例题

自作多情 提交于 2019-11-29 03:23:39
贪心算法: 一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。 二、贪心算法的基本思路: 1.建立数学模型来描述问题。 2.把求解的问题分成若干个子问题。 3.对每一子问题求解,得到子问题的局部最优解。 4.把子问题的解局部最优解合成原来解问题的一个解。 三、贪心算法适用的问题 贪心策略适用的前提是:局部最优策略能导致产生全局最优解。 实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。 四、贪心算法的实现框架 从问题的某一初始解出发; while (能朝给定总目标前进一步) { 利用可行的决策,求出可行解的一个解元素; } 由所有解元素组合成问题的一个可行解; 五、贪心策略的选择 因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。 几个经典的例子: 一

算法第四章作业

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-28 18:43:00
算法第四章作业 对贪心算法的理解 贪心算法:每次从局部贪心,找到局部最优,最后再找到全局最优,但是不一定是题目的最优解。 一般框架: 1)输入集合;2)初始空解集;3)在选集中做贪心选择,判断是否满足约束条件。 基本要素:贪心选择性质与最优子结构性质 基本步骤: 1) 从问题某初始结开始; 2) 循环中,根据局部策略,得到一个部分解,做小问题规模。 3) 综合所有解,的到最终解。   2.汽车加油问题的贪心选择性质 每次出发时 比较车的剩余油量与去下一站的耗油量的大小 , 剩余油量大则去下一站并减去去下一站的耗油量,如果剩余油量小 剩余量重置为满油 。 来源: https://www.cnblogs.com/Epher/p/11939234.html

Algorithm lesson final exam

走远了吗. 提交于 2019-11-28 16:27:23
1、algorithm analysis O B/W/AV/AMOR,混入其他问题,设计+分析 2、传统算法(肯定要考) 1)divide and conquer master therem、 recursive tree、分析复杂度、递归树加起来得到最终结果 2)greedy algorithm example sort->select 拟阵 独立系统的贪心模板,直接得到近似比 3)dynamic programming sub-optimal structrue、编辑距离 3、graph algorithm 1)exproration bfs and dfs、最小生成树 2)最短路,single path all pair 负环、负边 3)max-flow 优化方式 4、turing machine Np/NPC NP-hard np-reduction 5、approximation greedy/sequential/local search/lp rouding 三种算法的设计、图算法、图灵机、近似算法 来源: https://www.cnblogs.com/elpsycongroo/p/11939165.html

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

 ̄綄美尐妖づ 提交于 2019-11-28 12:44:22
#include "pch.h" #include <iostream> #include <stdio.h> int main() { const int RMB[] = { 200, 100, 20, 5, 1 }; const int NUM = 5; int X = 628; int count = 0; for (int i = 0; i < NUM; i++) { int use = X / RMB[i]; count += use; X = X - RMB[i] * use; printf("需要面额为%d的%d张, ", RMB[i], use); printf("剩余需要支付金额%d.\n", X); } printf("总共需要%d张\n", count); return 0; } 一、分糖果 二、摇摆序列 class Solution { public: int wiggleMaxLength(std::vector<int>& nums) { if (nums.size()< 2) { return nums.size(); } static const int BEGIN = 0; static const int UP = 1; static const int DOWN = 2; int STATE = BEGIN; int max_length =

POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

家住魔仙堡 提交于 2019-11-28 04:58:39
本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序 (poj1094) (5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020) (6)最大流的增广路算法(KM算法). (poj1459,poj3436) 三.数据结构. (1)串 (poj1035,poj3080,poj1936) (2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388

贪心算法_A1033 To Fill or Not to Fill (25 分)

爱⌒轻易说出口 提交于 2019-11-28 00:32:53
https://pintia.cn/problem-sets/994805342720868352/problems/994805458722734080 题目大意:汽车从杭州出发可以通过高速公路去任何城市,但是油箱的容量是有限的,路上有很多加油站,每个加油站的价格不同,为汽车设计一个从杭州到终点的最便宜的路线,Cmax表示油箱最大容量,D表示杭州到目的地的距离,Davg表示平均每单位的汽油可以让汽车行驶的距离,N表示汽车的站点数量,每个站点都会给出它的单位油价Pi和汽车站点和杭州的距离Di,求汽车从杭州到终点的最小花费,如果不能够到达,就输出汽车能够行驶的最大距离 分析:贪心算法。 0.假设增加一个目的地处的加油站,距离为目的地的距离,价格为0,考虑从0距离开始能否到达最后一个加油站的问题 1.因为先开始没有油,所以如果所有的加油站距离都没有等于0的,那么说明车哪也去不了,直接输出并return 2.将加油站按照距离dis从小到大排序 3.先去第一个加油站,设置变量nowdis表示当前所在的距离,maxdis是能够到达的最大距离,nowprice是当前的站点的价格,totalPrice是总的价格。 贪心思想: 0.寻找比自己距离远的,到能够到达的最大距离之间的加油站,看他们的油价。如果找到了更低价格的油价,就加油到刚好能到达那个加油站的距离的油,然后去那个更低价格的加油站

第四章作业

依然范特西╮ 提交于 2019-11-28 00:31:22
你对贪心算法的理解(2分) 贪心算法是一步一步往下走的,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯。 请说明汽车加油问题的贪心选择性质(2分) 贪心选择性质指的是问题的最优解能够通过局部最优解来求得,令m表示k-1到k的距离。每一次都加满油再出发,根据贪心算法的选择性质为了要使加油次数最少会选择离加满油的点远一点的加油站。当加满油之后,都要使此后过程中加油次数最少。每一次汽车中剩下的油不能再行驶到下一站时就在该站加油,一次次循环。 请说明在本章学习过程中遇到的问题及结对编程的情况(1分 贪心算法的本质很简单易懂,但是我们对于什么时候适合使用贪心算法还是有些疑问,对问题不能透彻的分析是我的弱点。我会尽量多多做题,加强训练。 来源: https://www.cnblogs.com/sufeifan1020/p/10052158.html