本文实例讲述了PHP实现的贪婪算法。分享给大家供大家参考,具体如下: 背景介绍:贪婪算法与数据结构知识库算法可以说是离我们生活最近的一种算法,人总是贪婪的嘛,所以这种算法的设计是很符合人性的。之所以这么说,是因为人们会在生活中有意无意的使用贪婪算法来解决问题。最常见的就是找零钱了,每个人都没学过该怎么找零钱,但在所有面额的钱都充足时,每个人都会找出同样组合来凑够需要的钱。其实这里面就是贪婪算法在起作用。 设计思路:贪婪法的设计思路可以从两方面来理解,即直观上和数学上。从直观上理解贪婪算法就是用最快的方法来解决问题。在这里面“快”是主要目标,例如上面找零钱的例子,假如你要找的零钱为6.6元。那首先要拿一张5元的,因为这可以使你凑的钱增长最快。如果人民币有6元的面额那你肯定会选6元的而不是拿两张别的来凑6元;从数学上来理解贪婪算法就是在做判断时以当前最优解为目标,类似于最优化中的最速下降法。这种方法的好处是解题速度极快,基本上是一次历遍就可以完成。 算法缺陷:正如做人不能太贪婪一样,贪婪算法本身有着致命的缺陷,这使得其应用背景收到了很多限制。因为算法是取的局部最优解,没有考虑以后的问题。这就像一个自私自利的人一样,虽然短时间内可以获得一些利益,但长期以往,很难会有大的成就。当然,社会很复杂,也许会有人一直自私下去而生活的还不错。这体现在算法上就是在一些情况下(具体下面会提到),贪婪算法是可以得到最优解的,这对于算法设计来说当然是好事。
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱 P 和他实付的钱 A,你的任务是写一个程序来计算他应该被找的零钱。
贪心算法是一种优化问题的解决方法,它每步选择当前状态下的最优解,最终希望通过局部最优的选择得到全局最优解。在本文中,我们将深入讲解Python中的贪心算法,包括基本概念、算法思想、具体应用场景,并使用代码示例演示贪心算法在实际问题中的应用。
http://blog.csdn.net/xywlpo/article/details/6439048
前面发了几篇python基础语法题目,主要用来帮助测试基础知识掌握的情况,如果都有认真看过或者做过的话,相信对自己的知识掌握情况应该有一定的了解了,接下来可以相应的去重新学习不是很清晰的那部分。
相比其它文章阅读量,总体上还是很不错的,可能是里面的任务目标比较明确吧,直接上的题目,并且用到的知识都是非常少的(不涉及到具体领域,比如图像处理),纯粹是逻辑问题,以有限的知识,解决大多数问题应该是大家都比较喜欢的。
找零问题,在贪心算法讲过。但是贪心不一定能得出最优解。假设有几种不同币值的硬币v1,v2,.……vn(单位是元)。如果要支付w元,求最少需要多少个硬币。比如,有3种不同的硬币,1元、3元、5元,我们要支付9元,最少需要3个硬币(3个3元的硬币)。
题目要求: 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱 P 和他实付的钱 A,你的任务是写一个程序来计算他应该被找的零钱。 输入 输入在 1 行中分别给出 P 和 A,格式为 Galleon.Sickle.Knut,其间用 1 个空格分隔。这里 Galleon 是 [0, 107] 区间内的整数,Sickle 是 [0, 17) 区间内的整数,Knut 是 [0, 29) 区间内的整数。 输出 在一行中用与输入同样的格式输出哈利应该被找的零钱。如果他没带够钱,那么输出的应该是负数;如果他带的钱刚好,那么输出"gang gang hao."。 样例输入 10.16.27 14.1.28 样例输出 3.2.1
需要凑的钱最多100000,面额最多10种,每种张数最多1000,面额最大不超过1000
前面写过一篇博文,介绍了什么是动态规划算法。动态规划算法的最大特点,原始问题可以通过分解成规模更小的子问题来解决,子问题之间互成依赖关系,也就是先计算出来的子问题的结果会影响到后续子问题的结果。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。 注意,一开始你手头没有任何零钱。 如果你能给每位顾客正确找零,返回 true ,否则返回 false 。 示例 1: 输入:[5,5,5,10,20] 输出:true 解释: 前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
大致意思就是 people.length个人, 每个人的身高为people[i][0](i 为第i个人) ,与此同时在他前面有people[i][1]个人身高更高或者相同的人。 但是这些人是被打乱顺序的 ,这里需要我们按照每个人的升高和 在他前面的人个数 , 给他们重新排序。使得排序后的people符合测试用例的result。
动态规划算法一直是面试手撕算法中比较有挑战的一种类型。很多的分配问题或者调度问题实际上都可能用动态规划进行解决。(当然,如果问题的规模较大,有时候会抽象模型使用动归来解决,有时候则可以通过不断迭代的概率算法解决查找次优解)
贪心算法的基本思想是每一步都选择当前状态下的最优解,通过局部最优的选择,来达到全局最优。
在上面图中再加入些区间数据[2,3];[-1,4],[5,12];[4,5],代码实现如下:
数据结构和算法是程序的 2 大基础结构,如果说数据是程序的汽油,算法则就是程序的发动机。
钞票找零问题是一个非常古老的问题,百度那些都有,本文将一步步的讲解关于钞票找零的算法以及优化过程.
找零问题:需找零金额为W,硬币面值有(d1, d2, d3,…,dm),最少需要多少枚硬币。 问题:需找零金额为8,硬币面值有(1, 3, 2, 5),最少需要多少枚硬币。 设F(j)表示总
最优解能够划分成多个次优解,例如找零钱问题中,零钱的种类必须是倍数包含关系(如100,20,10,15,1元),如果包含了50元或7元类型,贪心法求解可能出错,此时应该使用动态规划来做。
在前面的文章中(js算法初窥02(排序算法02-归并、快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而动态规划则是把问题分解成互相依赖的子问题。 那么我还有一个疑问,前面讲了递归,那么递归呢?分治法和动态规划像是一种手段或者方法,而递归则是具体的做操作的工具或执行者。无论是分治法还是动态规划或者其他什么有趣的方法,都可以使用递归这种工具来“执行”代码。 用动态规划来解决问题主要分为三个步骤:1、定义
第一种没有添加caching的递归实现,完成一次63分零钱的找零竟然需要60s,简直无法忍受。 而添加了caching的递归,一次找零0.22ms就完成了,这是生动的用空间换时间的算法。而采用DP思想的算法,0.14ms就完成了。
软考中级(软件设计师)——数据库设计(下午15分)——数据结构及算法应用(最难的点1个答题15分-程序填空题-目标3-9分)
平常我们在购物付款时,使用手机中的微信或支付宝扫一扫即可完成支付,无需像以前携带现金等着商户找零钱。线下扫码支付大大的提高了我们付款的效率,今天就主要谈一谈扫码支付的实现流程,让我们享受快捷的同时,也了解其中的原理。
专栏链接 https://blog.csdn.net/shiliang97/category_9294537_2.html
卡特兰数是一个数列,其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, ......
在前面的文章中(js算法初窥02(排序算法02-归并、快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而动态规划则是把问题分解成互相依赖的子问题。
本系列为FPGA系统性学习学员学习笔记整理分享,如有学习或者购买开发板意向,可加交流群联系群主。
“正月初二路上看,尽是小生和小旦”。今日是大年初二,按民间习俗,是“回娘家”的日子。即出嫁的女儿要与丈夫带着孩子同行回娘家,所以又称为“迎婿日”、“姑爷节”。
2021-06-21:贩卖机只支持硬币支付,且收退都只支持10 ,50,100三种面额。一次购买只能出一瓶可乐,且投钱和找零都遵循优先使用大钱的原则,需要购买的可乐数量是m, 其中手头拥有的10、50、100的数量分别为a、b、c,可乐的价格是x(x是10的倍数) 。请计算出需要投入硬币次数?
输入一个以秒为单位的整数,转换为小时、分和秒输出。输出格式见样例。(以24小时制显示)
贪心算法又称贪婪算法,是一种常见的算法思想。贪心算法的优点是效率高,实现较为简单,缺点是可能得不到最优解。
在一条直线上,有n个房屋,每个房屋中有数量不等的财宝,有一个盗 贼希望从房屋中盗取财宝,由于房屋中有报警器,如果同时从相邻的两个房屋中盗取财宝就会触发报警器。问在不触发报警器的前提下,最多可获取多少财宝?例如 [5,2,6,3,1,7],则选择5,6,7
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
二、贪心策略的正确性 因为有可能“贪心策略”是一个错误的方法 正确的贪心策略,是需要证明的
在学习数据结构的时候,我们已经见过了贪心思想在Prim和Kruskal中的完美应用,贪心思想因为其的简洁在算法中经常会被用到,有的时候在生活中,我们也会无意中使用到l贪心算法。比如在去shopping时,经常需要进行找零钱的过程,我们总是不自觉的先把大的找出来。
见过蹭吃、蹭喝、蹭车、蹭WiFi的 那你见过高速蹭ETC的吗? 来,开 眼 界 了! 据媒体报道 江苏曾有一名男子在一年内两地短程通勤时 “蹭”过ETC191次、逃避缴纳高速过路费5000多元 最终~~~ 被吊销驾驶证、拉入黑名单并判处有期徒刑八个月 跟车逃费成为日常,结果真的很悲剧 这些年,ETC出行得到了大力普及 给广大车主朋友提供了快捷的通关便利 而背后正是得益于车牌识别技术(LPR)的成熟应用 及当下移动金融应用场景线上线下领域的加速拓展 以腾讯云AI汽车相关OCR识别技术为例 基于行业
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。 简单理解: (1)时间复杂度:执行这个算法需要消耗多少时间。 时间复杂度:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。 (2)空间复杂度:这个算法需要占用多少内存空间。 空间复杂度(Space Complexity) 是对一个算法在运行过程中临时占用存储空间大小的量度,记做 S(n)=O(f(n)) ,其中n为问题的规模。利用算法的空间复杂度,可以对算法的运行所需要的内存空间有个预先估计。 一个算法执行时除了需要存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些计算所需的辅助空间。算法执行时所需的存储空间包括以下两部分。 (1)固定部分。这部分空间的大小与输入/输出的数据的个数、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。 (2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
力扣题目链接:https://leetcode-cn.com/problems/lemonade-change
有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25、50、100元),而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零(假设饭堂阿姨足够聪明)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/53924772
但是,当我们只有1张50的和3张20的时候,money定位60块钱就会出现问题。 会提示找不开,这种情况下我们使用贪心算法得到的答案就不是最优解,因为我们一直在尝试用最大的纸币来尽可能的使用最少的张数来解决问题。这就不是最优的。
每年一到要找工作的时候,我就能收到很多人给我发来的邮件,总是问我怎么选择他们的 offer,去腾讯还是去豆瓣,去外企还是去国内的企业,去创业还是去考研,来北京还是回老家,该不该去创新工场?该不该去 thoughtworks?……等等,等等。今年从 7 月份到现在,我收到并回复了 60 多封这样的邮件。我更多帮他们整理思路,帮他们明白自己最想要的是什么。(注:我以后不再回复类似的邮件了)。 我深深地发现,对于我国这样从小被父母和老师安排各种事情长大的人,当有一天,父母和老师都跟不上的时候,我们几乎完全
领取专属 10元无门槛券
手把手带您无忧上云