贪心算法

▶ 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

▶ 贪心算法并不保证会得到最优解,但是在某些问题.上贪心算法的解就是最优解。要会判断一个问题能否用贪心算法来计算。

(1)找零问题

▶ 假设商店老板需要找零n元钱,钱币的面额有: 100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少?

def change(bills, money):mon = [0 for _ in range(len(bills))]for key, value in enumerate(bills):mon[key] = money // valuemoney = money % valuereturn mon,moneybills = [100, 50, 20, 5, 1]
print(change(bills, 376))  # ([3, 1, 1, 1, 1], 0)

(2)背包问题

▶ 一个小偷在某个商店发现有n个商品,第i个商品价值Vi元,重Wi千克。他希望拿走的价值尽量高,但他的背包最多只能容纳W千克的东西。他应该拿走哪些商品?

0-1背包:对于一个商品,小偷要么把它完整拿走,要么留下。不能只拿走一部分,或把一个商品拿走多次。(商品为金条)

分数背包:对于一个商品,小偷可以拿走其中任意一 部分。(商品为金砂)

0-1背包不能用贪心算法来做,因为找到的不是最有解;分数背包可以,每次先拿单位重量最值钱的那个商品。

'''
-*- coding: utf-8 -*-
@author: Qiufen.Chen
@time: 2021/8/12:11:13
'''def fractional_backpack(goods,w):m = [0 for _ in range(len(goods))]total_value = 0for i, (price,weight) in enumerate(goods):if w >= weight:m[i] = 1total_value += pricew -= weightelse:m[i] = w/weighttotal_value += m[i] * pricew = 0breakreturn total_value, m# 每个商品元组表示表示(价格,重量)
goods = [(60,10),(100,20),(120,30)]
goods.sort(key=lambda x: x[0]/x[1], reverse=True)
print(fractional_backpack(goods,60))

(3)拼接最大数字问题

▶ 有n个非负整数,将其按照字符串拼接的方式拼接为一个整数。

▶ 如何拼接可以使得得到的整数最大

▶ 例:32,94,128,1286,6,71可以拼接除的最大整数为94716321286128

'''
-*- coding: utf-8 -*-
@author: Qiufen.Chen
@time: 2021/8/12:8:31
'''
from functools import cmp_to_keydef xy_cmp(x,y):if x+y < y+x:return 1elif x+y > y+x:return -1else:return 0def numberJoin(nums):# 转换成字符串,然后比较大小nums = list(map(str, nums))print(nums)  # ['32', '94', '128', '1286', '6', '71']nums.sort(key=cmp_to_key(xy_cmp))print(nums)  # ['94', '71', '6', '32', '1286', '128']return "".join(nums)nums = [32,94,128,1286,6,71]
print(numberJoin(nums))

(4)活动选择问题

▶ 假设有n个活动,这些活动要占用同一片场地,而场地在某时刻只能供一个活动使用。

▶ 每个活动都有一个开始时间Si和结束时间Fi (题目中时间以整数表示),表示活动在[Si,Fi)区间占用场地。

'''
@author: Qiufen.Chen
-*- coding: utf-8 -*-
@time: 2021/8/12:10:48
'''def activity_selection(act):res = [act[0]]for i in range(1,len(act)):# 当前活动的开始时间小于等于最后一个入选活动的结束时间if act[i][0] >= res[-1][1]:# 不冲突res.append(act[i])return resactivities = [(1,4),(3,5),(0,6),(5,7),(3,9),(5,9),(6,10),(8,11),(8,12),(2,14),(12,16)]# 保证活动是按照结束时间排序
activities.sort(key=lambda x:x[1])# [(1, 4), (5, 7), (8, 11), (12, 16)]
print(activity_selection(activities))

python-贪心算法相关推荐

  1. python贪心算法最短路径_dijkstra算法(贪心算法)——解决最短路径问题

    最短路径 给定一张带权图和其中的一个点(作为源点),求源点到其余顶点的最短路径 基本思想 1)源点u,所有顶点的集合V,集合S(S中存有的顶点,他们到源点的最短路径已经确定,源点u默认在S中),集合V ...

  2. python贪心算法几个经典例子_关于贪心算法的一些探讨、经典问题的解决和三种典型的贪心算法算法(哈弗曼,Kruskal,Prim)的Python实现。...

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是 ...

  3. python换零钱_黄哥Python, 贪心算法解决换零钱问题

    下面的文字来源于维基百科 贪心算法(英语:greedy algorithm) 又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法.比如 ...

  4. 农夫过河——python贪心算法实现

    1.问题描述: 一个农夫在河的西岸带了一匹狼.一只羊和一棵白菜,他需要把这三样东西用船带到河的东岸.然而,这艘船只能容下农夫本人和另外一样东西.如果农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜. 2.问 ...

  5. 会议室日程安排问题(python贪心算法)

    会议室日程安排问题(最少需要多少个会议室) 按照贪心算法,此问题可以得到最优解!原来是按结束时间排序,但这样的话并不是最少的会议室数(下面有反例)而要得到最少的会议室数,需要将议程时间按开始时间排序. ...

  6. Python贪心算法解决收银员找零问题

    场景描述 在超市结账时,假设只有1分.5分.1角.3角.5角.1元的硬币,如果需要找零钱,给定需要找的零钱数目,使收银员找给顾客的硬币数量最少,运行程序如图: 知识补充  贪心算法是指在当前问题求解中 ...

  7. python贪心算法最短路径_贪心算法2-单源最短路径

    1.问题分析 给定有向带权图G = (V, E),其中每条边的权是非负实数.此外,给定V中的一个顶点u,称为源点.现在要计算从源到所有其它各顶点的最短路径,这里的路径指的是路径上各边的权值之和. 求单 ...

  8. python贪心算法最短路径_贪心算法---最短路径问题

    一,贪心算法的设计思想 • 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止. 二,贪心算法的基本性质 ...

  9. python贪心算法求删数问题_贪心算法删数问题

    删数问题 给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列组成一个新的正整数.对于给定的n和k,设计一个算法,找出剩下数字组成的新数最少的删数方案. 输入示例: 178543 4 输出 ...

  10. python贪心算法——以“修理牛棚”题目为例

    [USACO1.3]修理牛棚 Barn Repair 题目描述 在一个月黑风高的暴风雨夜,Farmer John 的牛棚的屋顶.门被吹飞了 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个 ...

最新文章

  1. C语言程序设计省二考试,浙江省高校计算机等级考试大纲(二级——C语言程序设计大纲)(...
  2. 「 Modbus-RTU报文解析」解析03、06、10功能码报文示例
  3. php 自动创建目录
  4. win10win键无反应_台式电脑开机主机没反应怎么办 电脑开机主机没反应解决【详解】...
  5. 04.MyBatis别名的设置和类型转换器
  6. MyBatis 解决模糊查询包含特殊字符
  7. SSH远程登录VWware上的LFS
  8. 随想录(强大的kprobe)
  9. wifi管家android,WiFi管家—轻松连上好wifi
  10. html页面获取时间格式,js实现动态获取系统时间,显示到页面上
  11. ASP.NET中实现二级或多级域名(修改UrlRewrite)
  12. HDU 2243 考研路茫茫——单词情结(AC自动机 + 矩阵快速幂)题解
  13. 开票接口系统能够解决的十大问题
  14. 令人期待的大戏:千亿百度
  15. PyTorch 深度学习:60分钟快速入门
  16. 「镁客·请讲」小库科技何宛余:用人工智能去更高效的协助建筑设计工作
  17. YOLOv7(目标检测)入门教程详解---环境安装
  18. 系统安全漏洞及解决方案
  19. 关系代数运算_关系代数
  20. 江苏移动CM101s-MV100-EMMC- M8233_强刷固件包

热门文章

  1. Mac Pycharm导入Pygame教程(超细)
  2. 清除Windows远程桌面连接记录
  3. 短视频解析去水印在线 伪原创视频如何搬运
  4. 海康威视ivms-4200(v2.8.2.2_CN)监控软件安装教程
  5. 物联网ARM开发高级
  6. 专访数科网维总经理王少康:把OFD文档做成信息时代的“数字纸张”
  7. Groovy从入门到精通
  8. 14种神笔记方法,只需选择1招,让你的学习和工作效率提高100倍!
  9. 智慧城市:Web GIS 地图应用 IOC 运营中心
  10. U8系统管理员怎么登录服务器,u8客户端如何登录服务器