丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
1概念
贪心的意思在于在作出选择时,每次都要选择对自身最为有利的结果,保证自身利益的最大化。贪心算法就是利用这种贪心思想而得出一种算法。
贪心算法作为五大算法之一,在数据结构中的应用十分广泛。例如:在求最小生成树的Prim算法中,挑选的顶点是候选边中权值最小的边的一个端点。在Kruskal算法中,每次选取权值最小的边加入集合。在构造霍夫曼树的过程中也是每次选择最小权值的节点构造二叉树。这种每次在执行子问题的求解时,总是选择当前最优的情形,恰好符合贪心的含义。
贪心算法可以简单描述为:大事化小,小事化了。对于一个较大的问题,通过找到与子问题的重叠,把复杂的问题划分为多个小问题。并且对于每个子问题的解进行选择,找出最优值,进行处理,再找出最优值,再处理。也就是说贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望得到结果是最好或最优的算法。
贪心算法在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
2算法流程
(1)建立数学模型来描述问题。(2)把求解的问题分成若干个子问题。(3)对每一子问题求解,得到子问题的局部最优解。(4)把子问题的局部最优解合成原来问题的一个解。
3伪代码
从问题的某一初始解出发while(能朝给定总目标前进一步)do选择当前最优解作为可行解的一个解元素;由所有解元素组合成问题的一个可行解。4示例
题目描述
题目分析
(1)建立数学模型设小明每次选择纸币面额为Xi,需要的纸币张数为n张,剩余待支付金额为V,则有:X1+X2+…+Xn=456.(2)问题拆分为子问题小明选择纸币进行支付的过程,可以划分为n个子问题:即每个子问题对应为:在未超过456的前提下,在剩余的纸币中选择一张纸币。(3)制定贪心策略,求解子问题制定的贪心策略为:在允许的条件下选择面额最大的纸币。则整个求解过程如下:
(4)将所有解元素合并为原问题的解
小明需要支付的纸币张数为7张,其中面值100元的4张,50元1张,5元1张,1元1张。