c语言程序设计——贪心算法

1、贪心法的基本思想贪心法的基本思想例1:日常生活中经常会碰到找硬币的例子。现有四种硬币,它们的面值分别是1元,5角,1角和1分。现在要给顾客2元1角3分钱。如何找使得所拿出的硬币个数最少贪心法贪心法将一个最优决策过程变成多步决策过程,并在每步总是做出当前看来是最好的选择。贪心算法并不从全局最优上加以考虑,它所做的选择只是在某种意义上的局部最优选择。例2:如果硬币的币值改为1分,5分,1角1分三种,现要找给顾客1角5分1个1角1分+4个1分贪心算法的定义在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优

2、解,这种求解方法就是贪心算法。部分背包问题问题描述算法描述算法证明算法分析问题描述问题:给定问题:给定n种不同物品和一个背包,背包容种不同物品和一个背包,背包容量为量为M,物品,物品i的重量是的重量是Wi,装物品,装物品i的利润是的利润是Pi,假定物品,假定物品i的一部分的一部分xi(0xi1),放进放进背包背包,得到利润得到利润Pixi问:应该如何装包,才能获得最大利润?问:应该如何装包,才能获得最大利润?问题描述给定给定M0,Wi0,Pi0,1in,要求找一个,要求找一个n元元向量向量(x1,x2,xn),0xi1,1in,使得,使得nPixii=1达到最

3、大,同时满足达到最大,同时满足nWixiMi=1算法描述例给定n=3,M=40,(W1,W2,W3)=(28,15,24),(P1,P2,P3)=(35,25,24)。五个可能的解如下:(x1,x2,x3)WixiMPixi1(1,4/5,0)4055先装利润最大2(1/2,1,1/3)3750.53(1/28,1,1)4050.25先装重量最小4(5/7,1,5/24)4055(25/28,1,0)4056.25先装利润重量5比值最大算法描述背包问题的贪心算法背包问题的贪心算法输入:输入:P(1:n),W(1:n),M,按,按P(i)

4、/W(i)P(i+1)/W(i+1)的顺序读入的顺序读入输出:输出:X(1:n)ProcedureGREEDY-KNAPSACKreal:P(1:n),W(1:n),X(1:n),M,CU;Integer:i,n;begin1.Read(P(1:n).W(1:n),M);/设按设按P(i)/W(i)P(i+1)/W(i+1)的顺序读入的顺序读入/2.fori=1tondo3.X(i)=0;/X(i)赋初值赋初值/4.CU=M;/CU是背包问题的剩余容量是背包问题的剩余容量/5.I:=1;6.whileWICUdobegin7.XI:=1;8.CU:=CU-WI,

5、9.I:=I+1end;10.XI:=CU/WIend算法证明定理定理如果如果P1/W1P2/W2Pn/Wn,算,算法法GREEDY_KNAPSACK产生背包问题的产生背包问题的一个最优解。一个最优解。证明:设证明:设(x1,x2,xn)是算法产生的一个解,不是算法产生的一个解,不失一般性,设存在某个失一般性,设存在某个j,1jn,x1=x2==xj-1=1,0xj1,xj+1=xj+2==xn=0。再设再设(x1,x2,xn)是一个最优解,我们证是一个最优解,我们证明明(x1,x2,xn)(x1,x2,xn)。若不然,必存在若不然,必存在k,

7、复杂性O(n)空间复杂性空间复杂性O(n)贪心法的基本思想一种多步决策方法一种多步决策方法每一步使目标函数值增加最快或最慢每一步使目标函数值增加最快或最慢选择最优化量度是方法的关键选择最优化量度是方法的关键贪心算法的基本要素对于一个具体的问题,怎么知道是否可用对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最贪心算法解此问题,以及能否得到问题的最优解呢优解呢这个问题很难给予肯定的回答。这个问题很难给予肯定的回答。但是,从许多可以用贪心算法求解的问但是,从许多可以用贪心算法求解的问题中看到这类问题一般具有题中看到这类问题一般具有22个重要的性质:个重要的性

8、质:贪心选择性质贪心选择性质和和最优子结构性质最优子结构性质。1711、贪心选择性质、贪心选择性质所谓所谓贪心选择性质贪心选择性质是指所求问题的是指所求问题的整体最整体最优解优解可以通过一系列可以通过一系列局部最优局部最优的选择,即贪心的选择,即贪心选择来达到。这是贪心算法可行的第一个基本选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区要素,也是贪心算法与动态规划算法的主要区别。别。对于一个具体问题,要确定它是否具有贪对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优

9、解。最终导致问题的整体最优解。当一个问题的最优解包含其子问题的当一个问题的最优解包含其子问题的最优解时,称此问题具有最优解时,称此问题具有最优子结构性质最优子结构性质。问题的最优子结构性质是该问题可用动态问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征规划算法或贪心算法求解的关键特征。22、最优子结构性质、最优子结构性质动态规划和贪心算法都是一种递推算法均有局部最优解来推导全局最优解不同点:贪心算法:1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。2.由(1)中的介绍,可以知道贪

10、心法正确的条件是:每一步的最优解一定包含上一步的最优解。动态规划算法:1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解3.边界条件:即最简单的,可以直接得出的局部最优解贪心算法每一步都做目前最好的选择,不考虑下一步的选择。动态规划的子问题每一步求的最优解影响下一个问题的最优解。贪心算法是种策略,思想。它并没有固定的模式动态规划的思想是分治+解决冗余把一个复杂的问题分解成一块一块的小问题每一个小问题中得到最优解再从这些最优解中获取更优的答案贪心算法和动态规划算法都

11、要求问题具贪心算法和动态规划算法都要求问题具有最优子结构性质,这是有最优子结构性质,这是22类算法的一个类算法的一个共同点。但是,对于具有共同点。但是,对于具有最优子结构最优子结构的问的问题应该选用贪心算法还是动态规划算法求题应该选用贪心算法还是动态规划算法求解解是否能用动态规划算法求解的问题也是否能用动态规划算法求解的问题也能用贪心算法求解能用贪心算法求解(例如“0-1背包问题”与“部分背包问题”)3、贪心算法与动态规划算法的差异0-1背包问题给定一个最大载重量为M的卡车和N种动物。已知第i种动物的重量为Wi,其最大价值为Vi,设定M,Wi,Vi均为整数,编程确定一个装货方

THE END
1.路径规划基于matlab粒子群算法栅格地图最短路径规划含Matlab源码1.2.1基本思想 粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子https://blog.csdn.net/TIQCmatlab/article/details/115014184
2.算法与程序设计思想(精选8篇)《算法与程序设计思想》教学案例1 一、教学目标 1.知识与技能: 求一批数据中最大值的算法设计思想,并将算法的设计思想用流程图表示出来。2.过程与方法: 利用现实生活中比较身高的活动,以及对武术比赛中“打擂台”流程的逐步梳理,让学生学会从此类生活实际中提炼出求最大值的思想方法,即算法思想。 https://www.360wenmi.com/f/fileavgfb18k.html
3.基于FPGA的FIR数字滤波器设计FPGA元器件在高速并行处理和数据传输中有独特优势,FPGA正在前端信号处理中越来越多地代替ASIC和DSP。我们需要的就是这种设计周期短,功能密度高,重组时间短的元器件。本文在FPGA元器件的基础上,实现现代FIR数字滤波器功能。并且研究多种快速的FIR数字滤波器的理论设计思想和程序设计方法。 https://www.eet-china.com/mp/a309942.html
4.C语言常见排序算法归并排序C语言归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法 (Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序 列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 1.2 算法思想 到这里,我们可以得到一https://www.jb51.net/article/255354.htm
5.一种基于LSD改进的室内直线特征匹配算法2.2 Light-LSD算法设计思想 针对室内长廊场景下存在大量垂直线段特征,改进算法的主要任务就是用尽可能少的线段特征描述出室内结构,原版LSD 造成大量冗余线段特征的原因是大量长短不一的短线段描述了图像中的同一处线特征。如图10 所示,原版LSD 会在图像中物体边缘处产生多条短线段,但理想情况下只应该有一条长线段紧紧https://www.fx361.com/page/2022/0725/10775281.shtml
6.程序=数据结构+算法《禅与计算机程序设计艺术》/陈光剑“数据结构和算法是过去 50 年来最重要的发明之一,它们是软件工程师需要了解的基础工具。”《Think Data Structures: Algorithms and Information Retrieval inJava》(Allen B.Downey) 基本数据类型 道生一,一生二,二生三,三生万物。 在计算机程序设计的世界里,先有基本数据类型,复合组装成复杂对象类型,不同对象之间https://cloud.tencent.com/developer/article/1815180
7.算法与程序设计课教学反思与建议.doc算法与程序设计课教学反思与建议.doc,算法与程序设计课教学反思与建议 算法与程序设计作为信息技术课程中的选修模块,其内容在广度和深度上都具有较高的要求。课标中对本模块的教学目标表述为“体验算法思想,了解算法和程序设计在解决问题过程中的地位和作用;能从简单问题https://max.book118.com/html/2018/0528/169137262.shtm
8.网络工程专业人才培养方案(2022)3. 工程基础知识。掌握从事网络工程专业所需的数字电路与逻辑设计、计算机组成原理、程序设计、算法与数据结构、软件工程概论、数据库原理与技术等基础知识。 4. 网络工程专业知识。掌握从事网络工程专业所需的计算机网络原理与技术、操作系统、信息安全导论、物联网技术基础、网络安全技术、网络互连技术、无线网络技术、网https://www.csust.edu.cn/jtxy/info/1148/20900.htm
9.《算法与程序设计》课堂教学教材组织方案《算法与程序设计》课堂教学教材组织方案 一.课堂教学教材组织方案简介 《算法与程序设计》是高中信息技术课程的选修模块之一。通过本课程的学习,让学 生体验算法思想、了解算法和程序设计在解决问题过程中的地位和作用,并能从简单问题出 发,设计解决问题的算法,并能初步使用一种程序设计语言编制程序实现算法解决问题。https://doc.mbalib.com/view/076091718f8ad96a60434cc3a43481f7.html
10.系列文章分类汇总《程序员修炼之道》解读1 会计学包含的两种程序设计思想 在【编程一生】公众号留言:666 可获取经典电子书。 三言 三言集锦6|不断规划与寻找自己的人生,想法把自己变重要 三言周集锦|评估一个事情要比去理解你评估了什么容易 三言周集锦|一个人写的烂软件将会给另一个人带来一份全职工作 三言周集锦|考虑可维护性https://maimai.cn/article/detail?fid=1717206459&efid=rjkjp3XnQ3Cilaj-ZIoEXw
11.2024年四川专升本计算机考试大纲公布,包含考试内容参考书目了解程序设计的基本思想。掌握程序设计的基本结构(顺序结构、选择结构、循环结构)。 3.程序流程图 了解流程图的基本概念和应用。理解累加、累乘、顺序查找、二分查找、冒泡排序算法的思想。掌握根据流程图判断算法功能、得出算法结果的方法。 六、数据库技术 https://www.exueshi.com/news/6-30991
12.高中信息技术课程标准本模块旨使学生进一步体验算法思想,了解算法和程序设计在解决问题过程中的地位和作用;能从简单问题出发,设计解决问题的算法,并能初步使用一种程序设计语言编制程序实现算法解决问题。本模块为选修模块。 本模块的教学,应注意与数学课程中有关内容的衔接,要强调理论与实践的结合,引导学生注意寻找、发现身边的实际问题,进而https://www.fqkhzx.cn/index/article/view/id/94.html
13.程序员必须要知道的8种常用算法思想(转)寻觅左岸③ 递归算法通常显得很简洁,但是运行效率较低,所以一般不提倡用递归算法设计程序。 ④ 在递归调用过程中,系统用栈来存储每一层的返回点和局部量。如果递归次数过多,则容易造成栈溢出,所以一般不提倡用递归算法设计程序。 分治算法思想 分治算法也采取了各个击破的方法,将一个规模为N的问题分解为K个规模较小的子https://www.cnblogs.com/linxw-blog/p/10500570.html
14.计算机实验报告3.2算法设计思想与算法实现步骤 3.3程序核心代码,程序调试过程中出现的问题及解决方法 3.4 程序运行的结果 4、实验总结 4.1实验结果分析及问题讨论 4.2实验总结心得体会 注解:实验总结的内容根据不同学科和类型实验要求不一样,一般理工科类的实验需要对实验结果进行分析,并且对实验过程中问题进行讨论;在计算机上进行的编https://www.ruiwen.com/shiyanbaogao/5615610.html
15.程序设计基础清华大学基本的算法思想,如排序、查找、筛法、递推、递归、动态规划等; 文件创建与读写操作,以及各种应用。 本课程在教学过程中,将采用任务驱动方式,培养学生用程序设计语言解决实际问题的能力;强调在解题实践中掌握程序设计的基本概念、基本思想和基本方法;突出对编程思想的阐述和计算思维的训练;平时作业与测验考试均使用上机解https://www.xuetangx.com/courses/course-v1:TsinghuaX+30240233X_2015_T2+sp/about
16.程序设计的思想程序设计的思想是程序设计过程中的核心,它指导着程序员如何思考和解决问题。下面我们将探讨程序设计的几个关键思想。 1. 问题分解 程序设计始于问题分解。将复杂问题分解成更小、更易于管理的部分是程序设计的基础。这种分解有助于理解问题的结构,并为编写代码提供清晰的路径。 2. 抽象思维 抽象思维是程序设计中不可https://wenku.baidu.com/view/f1353f30e63a580216fc700abb68a98271feac8b.html
17.带你入门动态规划算法?动态规划(Dynamic Programming,DP)是算法设计思想中最难也是最有趣的部分。掌握动态规划算法,对于大厂面试是必不可少的。有接触过DP的小伙伴也许会联想到许许多多的名词,如什么状态转移方程什么的;要不就想到教材书上严谨而又晦涩难懂的对于动态规划的介绍;也有人想到高中的通项公式或数列题等等,但是左看右看都https://www.jianshu.com/p/5793f25a006d