【Python】贪心算法入门

一.引言

本文将通过两个问题和两道例题带你入门贪心算法。

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最优(最好或最有利)的选择,从而希望导致全局最优解的算法。贪心算法不保证找到全局最优解,但通常可以快速找到一个接近最优解的解。

二.背包问题和找零问题

1.背包问题

即为给你一个背包的容量,告诉你每个物品的价值和重量,找到最大价值的物品

代码实现:

解析:这不是0/1背包问题,而是分数背包问题(可以拿一部分物品),我们先对goods的单价排序,然后创建一个列表来记录每个物品要拿多少,然后遍历goods,如果背包容量大于物品重量,则记为1,背包容量减少,如果不够则记录分数,依次循环得到数量和价值

结果:

我们看到前面两个拿最多的后,最后一个只能拿三分之二,最终总价值最大。

2.找零问题

已知我们有1,5,20,50,100面额的钞票,给你一个数,用最少的钞票表示出来

结果:

输入376

得到

三.例题

1.数字拼接问题

有n个非负数,将其按照字符串拼接方式拼接成一个整数。如何拼接可以使得整数最大?

先拿两个数比较,把它们转化为字符串,a+b和b+a谁大就谁放前面,然后拼接在一起

代码实现:

from functools import cmp_to_key
li=[32,94,128,1286,6,71]def xy_cmp(x,y):if x+y<y+x:return 1elif x+y>y+x:return -1else:return 0def number_join(li):li=list(map(str,li))li.sort(key=cmp_to_key(xy_cmp))#python2中支持cmp,但py3只支持keyreturn "".join(li)#""里面是分隔符,使用join方法将字符串列表连接成一个单独的字符串,分隔符为一个空字符串print(number_join(li))

注意点:1.列表内置的sort不同于python的内置函数sorted,sort在原列表上修改,而sorted会创建一个新迭代对象,不会修改源对象。

2.sort方法只有python2才支持cmp参数,因此在python中想要实现自己的compare必须用到cmp_to_key的方法,最后实现的是降序排列(当然也可以用key加lambda实现)

3.对于compare的返回值

  • 如果返回值为负数,表示第一个参数小于第二个参数。
  • 如果返回值为零,表示两个参数相等。
  • 如果返回值为正数,表示第一个参数大于第二个参数

运行结果

2.活动选择问题

假设有n个活动,这些活动都要占用同一片场地,而场地在某时刻只能供一个活动使用,每个活动都有一个开始时间和结束时间,问安排哪些活动能够使该场地举办的活动个数最多?

代码实现:

activities=[(1,4),(3,5),(0,6),(3,9),(5,9),(6,10),(8,11),(8,12),(2,14),(12,16),(5,7)]
#保证活动是按照结束时间排好的
activities.sort(key=lambda x:x[1])def activity_selection(a):res=[a[0]]for i in range(1,len(a)):if a[i][0]>=res[-1][1]: #当前活动的开始时间大于等于结果中最后活动的结束时间#不冲突res.append(a[i])return resprint(activity_selection(activities))

运行结果:

感谢阅读,如果有帮助,点赞支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录

编辑目录和新建类似&#xff0c;这里我们用MVC提供的辅助类 1.在Model 的BookShopDBDataContext分部类里添加: 2. 在CategoryController添加如下方法(注意&#xff1a;我们添加了后端验证) 3. 修改View下的EditCategory.aspx. (注意&#xff1a;我们用了MVC提供的辅助类生成Tex…

内外边距、浮动、布局相关

关于清除元素的内外边距&#xff1a; 1、行内元素只有左右边距、没有内外边距、内边距在ie6等低版本的浏览器中也会有问题。尽量不要给元素指定行内的内外边距&#xff1b; 2、外边距的合并 使用margin定义块元素的垂直外边距时&#xff0c;可能会出现外边距的合并&#xff…

让vs2008支持jQuery的智能提示!

告诉大家一个非常好的消息&#xff0c;就是现在我们已可以让VS2008同时支持jQuery的智能提示功能啦可以先看看下面的效果图&#xff1a;jquery1.png (18.76 K)2008-3-30 14:37:54jquery2.png (21.18 K)2008-3-30 14:37:54怎样&#xff1f;酷吧&#xff0c;呵呵想实现以上效果只…

为什么要使用Vuex?

为什么要使用Vuex? 1. 假如不使用 1.1 父子组件依赖同一个state 1.2 兄弟组件依赖同一个state 2. 用了Vuex之后 3. 方便记忆和理解 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

使用注解配置Spring

使用注解配置Spring 1.为主配置文件引入新的命名空间(约束) 2.开启使用注解代理配置文件 3.在类中使用注解完成配置 将对象注册到容器 修改对象的作用范围 值类型注入 引用类型注入 注意: 初始化|销毁方法 转载于:https://www.cnblogs.com/HiJackykun/p/10428728.html

基于cookie的SSO单点登录系统

利用COOKIE实现单点登录功能 近期公司要求帮一个项目实现单点登录功能&#xff0c;在综合考量下决定采用cookie实现&#xff0c;大概的流程如下图所&#xff1a; 转载于:https://www.cnblogs.com/buggeerWang/p/10430770.html

js的栈与堆

JavaScript中基本数据类型和引用数据类型的区别 这是我引用别人的 觉得很好 1、基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值&#xff1a;基本数据类型和引用数据类型。 基本数据类型指的是简单的数据段&#xff0c;引用数据类型指的是有多个值构成的对象。 当…

android 获取程序,Android获取桌面应用程序

转载请注明出处&#xff0c;谢谢&#xff1a;http://blog.csdn.net/harryweasley/article/details/50057029首先在看这个博客之前&#xff0c; 你可以先看下这个博客&#xff0c;http://blog.csdn.net/harryweasley/article/details/50057707里面介绍了两种方式来获取应用程序的…

等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规

随着等保 2.0 时代的到来&#xff0c;网络安全要求更加严格&#xff0c;应用场景更加丰富&#xff0c;等级保护已成为互联网企业义不容辞的责任。作为国内移动安全领域的技术创新企业&#xff0c;几维安全在积极响应等保2.0时代的战略布局&#xff0c;推出等保2.0检测、等保加固…

js中什么是对象,对象的概念是什么?

我们一直在用对象 可是你真的理解对象吗&#xff0c;js中有一个说法是一切皆对象&#xff0c;其实这里说的应该是 一切皆可看作对象 对象就是可以拥有属性和方法的一个集合 士兵就是一个对象&#xff0c;它拥有身高体重的属性&#xff0c;保家卫国&#xff0c;吃饭睡觉的动作方…

又做了3个极品菜[图]

今天的是&#xff1a; 极品豆角炒鸡蛋 极品黄瓜炒鸡蛋 极品炒菠菜没鸡蛋 其他我做的菜请看 《我做的菜很香很好吃[有图]》 转载于:https://www.cnblogs.com/zjneter/archive/2008/04/13/1151383.html

Spring Integration Java DSL示例

现在已经为Spring Integration引入了新的基于Java的DSL &#xff0c;这使得可以使用基于纯Java的配置而不是基于Spring XML的配置来定义Spring Integration消息流。 我尝试使用DSL来获得示例集成流–我称其为Rube Goldberg流 &#xff0c;因为它在尝试大写作为输入传递的字符串…

automake linux,Linux下automake软件编译与发布快速入门

Linux下automake软件编译与发布快速入门2008-04-22eNet&Ciweek进入编辑界面&#xff0c;输入内容如下&#xff1a;AUTOMAKE_OPTIONSforeignbin_PROGRAMSsimserver1 #软件包名称simserver1_SOURCESsimserver1.cpp  #源文件列表&#xff0c;如果有多个则用空格分开LIBS -l…

android fragmentactivity fragment,Android:Activity与Fragment通信(99%)完美解决方案

前言最近一直在想着能否有一种更好的方案来解决&#xff1a;Android中Activity与Fragment之间通信的问题&#xff0c;什么叫更好呢&#xff0c;就是能让Fragment的复用性高&#xff0c;性能还有好(不用反射)&#xff0c;代码还要好维护&#xff0c;不需要为每对Activity和Fragm…

分布式人工智能标记语言(DAIML)示例

DAIML&#xff08;Distributed Artificial Intelligence Markup Language&#xff09;是用于分布式人工智能系统中智能语言的标记库。DAIML主要分为Pattern和Template两部分&#xff0c;Pattern用于模式匹配&#xff0c;Template用于回答模板&#xff0c;下面将分别介绍两者的示…

Ext.js数据展示问题name展示code

出现以上问题是因为model中定义的类型跟数据库不匹配 去掉js中vehicleModel的type或者改为type:int即可。转载于:https://www.cnblogs.com/feifeicui/p/10438900.html

Solr中的前缀和后缀匹配

搜索引擎都是关于查找字符串的。 用户输入一个查询词&#xff0c;然后从反向索引中检索它。 有时&#xff0c;用户正在寻找的值只是索引中值的子字符串&#xff0c;并且用户可能也对这些匹配感兴趣。 对于德语这样的包含复合词&#xff08;例如Semmelkndel&#xff09;的语言&a…

使用FormData进行Ajax请求上传文件

Servlet3.0开始提供了一系列的注解来配置Servlet、Filter、Listener等等。这种方式可以极大的简化在开发中大量的xml的配置。从这个版本开始&#xff0c;web.xml可以不再需要&#xff0c;使用相关的注解同样可以完成相应的配置。 我笔记里也有记文件上传&#xff1a;https://w…

基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息

技术栈 jquery文件上传&#xff1a;jquery.fileupload&#xff0c;github 文档apk 文件解析&#xff1a;app-info-parser&#xff0c;github 文档参考&#xff1a;前端解析ipa、apk安装包信息 —— app-info-parser 支持功能 点击或拖拽上传 apk 文件校验文件类型及文件大小js …

调试以了解终结器

这篇文章涵盖了Java内置概念之一&#xff0c;称为Finalizer 。 这个概念实际上是众所周知的&#xff0c;也是众所周知的&#xff0c;这取决于您是否有足够的时间来仔细研究一下java.lang.Object类。 就在java.lang.Object本身中&#xff0c;有一个名为finalize&#xff08;&…