贪心算法题实战详解

文章目录

      • 例题1:活动安排问题
      • 例题2:货币找零问题
      • 例题3:分数背包问题(部分背包问题)
      • 例题4:最小生成树问题(Prim算法)
      • 例题5:哈夫曼编码
      • 例题6:活动选择问题
      • 例题7:硬币找零问题

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(局部最优)的选择,以期望通过一系列局部最优决策达到全局最优解的算法。请注意,贪心算法并不总是能得到全局最优解,但在某些特定问题上非常有效。下面通过几个实战例题来详细解析贪心算法的应用。

例题1:活动安排问题

问题描述
给定一系列会议的时间段,包括每个会议的开始时间和结束时间,要求计算出最多能参加多少个会议,且这些会议之间不能重叠。

解题思路
按照会议结束时间的先后顺序对所有会议进行排序。每次选择结束时间最早的会议参加,并移除所有与之冲突的会议(即开始时间小于等于该会议结束时间的会议)。重复此过程,直到没有会议可选。

代码示例(伪代码):

sort(会议列表, 按结束时间升序)
已安排会议数 = 0
结束时间 = -for 会议 in 会议列表:
    if 会议开始时间 > 结束时间:
        已安排会议数 += 1
        结束时间 = 会议结束时间

return 已安排会议数

例题2:货币找零问题

问题描述
给定不同面额的硬币和一个总金额,计算最少需要多少枚硬币凑成这个总金额。

解题思路
从最大面额的硬币开始考虑,尽可能多地使用大面额的硬币,然后逐步减小面额直到凑够总金额。这是一种典型的贪心策略。

代码示例(伪代码):

硬币数量 = 0
剩余金额 = 总金额

sort(硬币列表, 降序)

for 硬币面额 in 硬币列表:
    while 剩余金额 >= 硬币面额:
        硬币数量 += 1
        剩余金额 -= 硬币面额

return 硬币数量

例题3:分数背包问题(部分背包问题)

问题描述
给定一组物品,每个物品有一定的价值和体积,以及一个背包的最大承载量,要求在不超过背包容量的情况下,使装入背包的物品总价值最大。

解题思路
与0-1背包不同,分数背包允许物品分割,可以取物品的一部分。这里可以按单位体积价值从大到小排序,优先选择单位体积价值高的物品尽可能多地装入背包。

代码示例(伪代码):

sort(物品列表, 按单位体积价值降序)

总价值 = 0

for 物品 in 物品列表:
    可以取的数量 = 背包当前剩余容量 / 物品体积
    取的数量 = min(可以取的数量, 物品总量)
    总价值 += 取的数量 * 物品价值
    背包当前剩余容量 -= 取的数量 * 物品体积

return 总价值

以上实例展示了贪心算法在不同场景下的应用,关键在于识别问题是否适合贪心策略,即局部最优解能否导致全局最优解。在实际应用中,还需要注意贪心算法的局限性,并非所有问题都能通过贪心策略获得最优解。

例题4:最小生成树问题(Prim算法)

问题描述
在一个带权无向图中,找到一棵包括所有顶点的树,使得树的所有边的权重之和尽可能小。

解题思路
Prim算法是解决最小生成树问题的一种贪心策略。算法开始时,任选一个顶点加入到树中,之后每次从未加入到树中的顶点中选择一个与当前树相连的边权值最小的顶点加入树中,直到所有顶点都被加入到树中。

代码示例(伪代码):

初始化已选择顶点集合为任意一个顶点,未选择顶点集合为其余顶点
初始化最小生成树的边集为空

while 未选择顶点集合非空:
    找到连接已选择顶点集合和未选择顶点集合的最小权重边 (u, v)
    将边 (u, v) 加入最小生成树的边集中
    将顶点 v 从未选择顶点集合移到已选择顶点集合

返回最小生成树的边集

例题5:哈夫曼编码

问题描述
给定一串字符及其出现频率,设计一种编码方式使得编码后的字符串总长度最短。

解题思路
哈夫曼编码是一种构造前缀编码的方法,通过构建一棵哈夫曼树来实现。首先将所有字符看作叶子节点,根据频率构建最小二叉堆,每次从堆中取出两个频率最小的节点合并成一个新的节点(新节点的频率为两个子节点之和),并放回堆中。重复这一过程直到堆中只剩下一个节点(树的根)。从根到叶子的路径即为该字符的编码。

代码示例(伪代码):

将所有字符及其频率构造成节点,并放入最小堆中

while 堆中节点数量 > 1:
    取出频率最小的两个节点
    创建一个新的内部节点,其频率为两个子节点频率之和
    将新节点加入堆中,同时删除那两个频率最小的节点

从根节点出发,遍历哈夫曼树,生成每个字符的编码

贪心算法以其直观和效率在许多问题中展现出独特的优势,但其适用范围有限,主要适用于能够通过局部最优直接推导出全局最优的问题。在设计贪心算法时,关键在于正确识别问题的贪心性质,并巧妙地定义“贪婪准则”。上述例题展示了贪心算法在不同场景下的灵活应用,希望对你有所帮助。

例题6:活动选择问题

问题描述
给定一系列活动,每个活动都有一个开始时间和结束时间。选择最多的活动数量,使得这些活动之间互不冲突,即任意两个活动不能同时进行。

解题思路
这是一个典型的贪心问题,可以按照活动的结束时间对所有活动进行排序。选择活动时,总是选择结束时间最早的活动,这样能保证后续有更多的机会选择其他不冲突的活动。

代码示例(Python):

def activitySelection(startTimes, endTimes):
    # 按照结束时间对活动进行排序
    activities = sorted(zip(startTimes, endTimes), key=lambda x: x[1])
    
    # 初始化第一个活动
    lastEnd = activities[0][1]
    selectedActivities = [activities[0]]
    
    for start, end in activities[1:]:
        # 如果当前活动的开始时间大于上一个选择活动的结束时间,则选择此活动
        if start >= lastEnd:
            selectedActivities.append((start, end))
            lastEnd = end
            
    return selectedActivities

# 示例输入
startTimes = [1, 3, 0, 5, 8, 5]
endTimes = [2, 4, 6, 7, 9, 9]

# 调用函数
selected = activitySelection(startTimes, endTimes)
print("Selected Activities:", selected)

例题7:硬币找零问题

问题描述
给定不同面额的硬币和一个总金额,计算最少需要多少枚硬币凑出这个总金额。

解题思路
对于每一种面额的硬币,尽可能多地使用它,直到不足以再使用为止,然后转向下一个较小面额的硬币。这是一种贪心策略,因为它在每一步都做出了局部最优的选择。

代码示例(Python):

def coinChange(coins, amount):
    coins.sort(reverse=True)  # 从大到小排序硬币面额
    count = 0
    for coin in coins:
        while amount >= coin:
            amount -= coin
            count += 1
        if amount == 0:
            break
            
    return count if amount == 0 else -1  # 如果无法凑出总金额,返回-1

# 示例输入
coins = [1, 2, 5]
amount = 11

# 调用函数
minCoins = coinChange(coins, amount)
print("Minimum Coins Needed:", minCoins)

以上两个例题进一步展示了贪心算法在解决优化问题上的魅力。活动选择问题通过简单的排序和选择策略达到了全局最优解,而硬币找零问题则通过优先考虑大面额硬币的策略有效地减少了硬币的数量。这些实例说明了在满足一定条件下,贪心策略能够以较低的复杂度得到问题的最优解或近似最优解。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KAN(Kolmogorov-Arnold Network)的理解 3

系列文章目录 第一部分 KAN的理解——数学背景 第二部分 KAN的理解——网络结构 第三部分 KAN的实践——第一个例程 文章目录 系列文章目录前言KAN 的第一个例程 get started 前言 这里记录我对于KAN的探索过程,每次会尝试理解解释一部分问题。欢迎大家和我一起讨…

Spring 之 Lifecycle 及 SmartLifecycle

最近在看Eureka源码,本想快速解决这场没有硝烟的战役,不曾想阻塞性问题一个接一个。为正确理解这个框架,我不得不耐着性子,慢慢梳理这些让人困惑的点。譬如本章要梳理的Lifecycle和SmartLifecycle。它们均为接口,其中后…

【TB作品】MSP430F149单片机,广告牌,滚动显示

LCD1602滚动显示切换播放暂停字符串 显示Public Places 显示No Smoking 播放 暂停 部分代码 char zifu1[] "Public Places "; char zifu2[] "Class Now "; char zifu3[] "No admittance "; char *zifu[] { zifu1, zifu2, zifu3 }…

【kafka】关于Kafka的入门介绍

为什么要使用kafka?kafka是什么东西? 案例场景 A服务向B服务发送消息,A服务传输数据很快,B服务处理数据很慢,这样B服务就会承受不住,怎么办?通过添加消息队列作为缓冲。kafka就是消息队列中的…

使用Xshell一键在多个会话中执行多个命令

背景 平时在工作中经常通过ssh远程操作Linux,由于我们负责的服务部署在超过5台服务器(相同的代码及路径),每次发布后执行重启都得重复操作5次关闭、检查、启动、查看日志,特别繁琐。 后来发现Xshell 7可以录制脚本&am…

This may be due to a blocked port, missing dependencies

安装XAMPPXAMPP之后启动mysql出现如下问题,只需双击XAMPP安装目录下的setup_xampp,等待运行完毕。 重启,双击xampp-control. 重新进入xampp控制界面,点击start。

【Pytorch 】Dataset 和Dataloader制作数据集

文章目录 Dataset 和 Dataloader定义Dataset定义Dataloader综合案例1 导入两个列表到Dataset综合案例2 导入 excel 到Dataset综合案例3 导入图片到Dataset导入官方数据集Dataset 和 Dataloader Dataset指定了数据集包含了什么,可以是自定义数据集,也可以是以及官方数据集Data…

PermissionError:Permission denied: ‘/dev/ttyUSB0’问题解决

1、问题描述 用树莓派5的一个usb口,接收IMU数据,运行python程序报错如下 2、问题解决 其实之前写过,方便后面好找,单独备份下, 查看ttyUSB0所属的用户组命令如下: ls -l /dev 以上可以看出ttyS*和ttyUS…

Pinia(三): 了解和使用state

1.state state 就是我们要定义的数据, 如果定义 store 时传入的第二个参数是对象, 那么 state 需要是一个函数, 这个函数的返回值才是状态的初始值.这样设计的原因是为了让 Pinia 在客户端和服务端都可以工作 官方推荐使用箭头函数(()>{ })获得更好的类型推断 import { de…

PX4 ROS2 真机

如果仿真跑通了。 真机遇到问题,可参考此文章。 ubuntu22 px4 1.14.3 ros2 humble 硬件接线。 先找两个usb - ttl串口,分别接到两台主机上,保证串口通信正常。 图中是个六合一的。浪费一天时间,发现是串口设置错误&#xff…

构建LangChain应用程序的示例代码:9、使用Anthropic API生成结构化输出的工具教程

使用Anthropic API生成结构化输出的工具 Anthropic API最近增加了工具使用功能。 这对于生成结构化输出非常有用。 ! pip install -U langchain-anthropic可选配置: import osos.environ[LANGCHAIN_TRACING_V2] true # 启用追踪 os.environ[LANGCHAIN_API_KEY…

eclipse-向Console控制台输出信息

首先这里主要用到的是org.eclipse.ui.console这个包,所以现在顺道先来了解一下: org.eclipse.ui.console是一个可扩展的console视图插件,利用它可以实现各种console,并把它们显示出来。该插件本身就实现了一个Message Console&…

AI之下 360让PC商业生态大象起舞

时隔7年,淘宝PC版在前不久迎来重磅升级,在产品体验、商品供给、内容供给等方面做了全面优化,以全面提升PC端的用户体验;当大家都以为移动互联网时代下APP将成为主流时,PC端却又成为了香饽饽。其实PC端被重视&#xff0…

【Linux】操作系统中的文件系统管理:磁盘结构、逻辑存储与文件访问机制

文章目录 前言:1. 磁盘机械结构2. 磁盘物理结构3. 磁盘的逻辑存储3. 1. 文件名呢?3.2 对文件的增删查改与 路径3.3. 文件 4. 软硬链接4.1. 操作观察现象4.2. 软硬链接的原理4.3. 软硬链接的应用场景 总结 前言: 在现代操作系统中&#xff0c…

mysql的锁(全局锁)

文章目录 mysql按照锁的粒度分类全局锁概念:全局锁使用场景:全局锁备份案例: mysql按照锁的粒度分类 全局锁 概念: 全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是: Flush tables with…

多输入多输出非线性对象的模型预测控制—Matlab实现

本示例展示了如何在 Simulink 中设计多输入多输出对象的闭环模型预测控制。该对象有三个操纵变量和两个测量输出。 一、非线性对象的线性化 运行该示例需要同时安装 Simulink 和 Simulink Control Design。 % 检查是否同时安装了 Simulink 和 Simulink Control Design if ~m…

网络网络层之(6)ICMPv4协议

网络网络层之(6)ICMPv4协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…

山东军博会—2024年智能装备和通信技术展:见证类脑视觉芯片如何重塑未来

随着人工智能技术的飞速发展,类脑计算成为了科研领域的一个热点。最近,我国科学家成功研发出世界首款类脑互补视觉芯片,这一重大突破不仅标志着我国在人工智能硬件领域迈出了重要一步,也为未来的智能设备带来了无限可能。本文将从…

玄机科技再度引领国漫风潮,携手百度文库共创AI动漫新纪元

在5月30日举办的百度移动生态万象大会上,国内知名动画制作及运营企业玄机科技受邀出席,并与百度文库达成重要战略合作,共同探索AI技术在动漫领域的应用,开启智能动漫解决方案的新篇章。此次合作不仅展现了玄机科技在动画制作领域的…

攻防世界maze做法(迷宫题)

首先查壳64bit,直接丢进ida64中进行反编译就完事儿了,然后直接进入main函数打注释分析首先,题目已经提示了这是个迷宫题,我们抓住做迷宫题的两个要点,一找玩法,二找地图, 玩法在主函数中&#…