【数据结构与算法】贪心算法及例题
目录
- 贪心算法
- 例题一:找零问题
- 例题二:走廊搬运物品最优方案问题输入样例
- 例题三:贪心自助餐
贪心算法
贪心算法是一种在每一步选择中都采取当前状态下最优的选择,以期望最终达到全局最优解的算法。它的核心思想是每次都选择当前最优解,而不考虑未来可能的情况。虽然贪心算法并不一定能够解决所有问题,但在一些特定情况下,它可以提供简单、高效的解决方案。
贪心算法适用于满足贪心选择性质和最优子结构性质的问题。贪心选择性质指的是每一步都选择当前最优解,而最优子结构性质指的是问题的最优解包含了子问题的最优解。
贪心算法的设计步骤通常包括:
- 确定问题的贪心选择性质: 需要明确每一步选择都是当前最优的特性。
- 构造解的候选集合: 根据贪心选择性质,确定每一步的选择范围。
- 确定选择的标准: 确定如何评价每个选择的优劣,并选择当前最优的解。
- 解决子问题: 通过递归或循环解决子问题。
- 合并子问题的解: 将各个子问题的解合并成原问题的解。
贪心算法是一种解决最优化问题的算法,其核心思想是在每一步选择中都采取当前状态下的最优选择,以期望最终达到全局最优解。相比之下,枚举法则是考虑所有可能情况,然后选出最优解。贪心算法与枚举法的不同之处在于贪心算法不进行回溯,而是在每个子问题中选择最优解后向下继续进行。
贪心算法主要适用于满足贪心选择性质的问题,即每一步选择都是局部最优解,最终得到的结果也是全局最优解的问题。贪心算法的设计步骤通常包括以下几个方面:
-
证明贪心选择性质: 证明问题的最优解可以通过一系列局部最优的选择得到。
-
将问题转化为贪心选择的形式: 将原问题转化为先做出选择,再解决剩下的子问题的形式。
-
求解子问题: 对每个子问题求解得到局部最优解。
-
合并子问题的解: 将子问题的局部最优解合并成原问题的解。
例题一:找零问题

输入:
在第一行给出测试例子个数 N ,用以代表需要找零的钱数
输入样例:
365
输出:
输出写法:
每一行输出数据输出找零的金额与数量
100:3
50:1
20:0
5:3
1:0
运行限制:
最大运行时间:1s
最大运行内存:128M
#include <iostream>
#include <algorithm>
#include<cstdio>
using namespace std;//面值
int t[5]={100, 50, 20, 5, 1};//张数
int m[5];void change(int n)
{for(int i=0;i<5;i++){m[i]=n/t[i];n=n%t[i];//print("%d",n);}
}int main()
{int N;cin>>N;change(N);for(int i=0;i<5;i++){printf("%d:%d\n",t[i],m[i]);}
}
例题二:走廊搬运物品最优方案问题输入样例

3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50
输出示例:
//每行代表每组完成任任务花费的最小时间
10
20
30
题目分析:
-
初步输入处理:
- 首先输入
T表示测试用例的数量。 - 然后循环处理每个测试用例,首先输入
N表示搬运次数,然后输入每次搬运的起点和终点。
- 首先输入
-
处理流程:
- 首先将起点和终点映射为走廊号,即通过
(房间号 - 1) / 2计算出走廊号。 - 确保起点比终点小,如果起点大于终点,则交换二者。
- 统计每个走廊被占用的次数,并同时更新最大占用次数
maxAns。 - 输出最大占用次数乘以 10,即为最短时间。
- 首先将起点和终点映射为走廊号,即通过
-
时间复杂度:该算法的时间复杂度主要取决于循环次数,即搬运次数
N。在每次搬运中,涉及到的操作都是常数时间的,因此总体时间复杂度为 O(N)。 -
空间复杂度:该算法的空间复杂度主要取决于
move数组,大小为 200。因此空间复杂度为 O(1)。
题解代码示例:
#include <cstdio>
#include <iostream>
#include<bits/stdc++.h>
using namespace std;/* - `move[200]`: 用于记录走廊的占用情况,数组下标表示走廊号,数组值表示该走廊被占用的次数。- `N`: 表示搬运次数,即每次搬运操作的数量。- `T`: 表示测试用例的数量。- `from`, `to`: 每次搬运的起点和终点。*/
int main()
{int move[200];
//搬运次数int N;int T;cin>>T;while(T--){//每次搬运的起点和终点int from, to;int maxAns=0;scanf("%d", &N);memset(move, 0, sizeof(move));for(int i = 0; i < N; i++){scanf("%d%d", &from, &to);
//将房间号映射为走廊号from = (from - 1)/2;to = (to - 1)/2;
//确保from<to,C++使用:swap(from, to)if(from > to)//确保起点比终点小{int temp = from;from = to;to = temp;}
//统计占用走廊情况,并统计最大值for(int j = from; j <= to; j++){move[j]++;maxAns=max(maxAns,move[j]);}}cout<<maxAns*10<<endl;}
}
例题三:贪心自助餐


输入样例:
20 1000
1 22
2 43
123 214
12 2
123 432
21 223
22 16
77 49
34 78
34 9
43 677
21 34
23 23
12 56
332 56
21 99
123 545
389 33
12 999
23 88
输出;
输出一行数据,表示最大的价值,保留三位小数。
输入样例:
1204.114
题解代码示例:
#include <iostream>
#include <algorithm>
#include<iomanip>
using namespace std;//需要一个结构体,通过性价比,能够查找到重量和价值。//做一个排序,需要将性价比由高到底排序,排序的过程中重量和(价值)要对应上struct Food
{double w;double v;double aver;};
//C++一般用 struct,因为默认都是public的bool cmp(Food a, Food b)
{return a.aver > b.aver;//助记大于号就是从大到小排序,小于号就是从小到大排序
}int main()
{Food foods[1009];int n;double C;double Value = 0;cin >> n >> C;for (int i = 0; i < n; i++){cin >> foods[i].v>>foods[i].w;//求性价比foods[i].aver = foods[i].v / foods[i].w;//cout << foods[i].aver << endl;}//性价比排序sort(foods, foods + n, cmp);//当背包(肚子)能装下所有物品(菜)时,直接输出所有的物品(菜品)价值之和//int sum = 0;for (int i = 0; i < n; i++){sum += foods[i].w;}if (sum <= C){for (int j = 0; j < n; j++)Value += foods[j].v;//V = floor(V * 1000.0) / 1000.0;cout << setiosflags(ios::fixed) << setprecision(3) <<Value << endl;return 0;}//当背包(肚子)不能装下所有物品时应该由性价比的顺序,选择装入的物品for (int i = 0; i < n; i++){if (foods[i].w <= C){Value =Value + foods[i].v;C = C - foods[i].w;}else{//直接将剩余的C加入即可Value =Value + C * foods[i].aver;C = 0;}if (C == 0)break;}//V = floor(V * 1000.0) / 1000.0;cout << setiosflags(ios::fixed) << setprecision(3) <<Value << endl;return 0;
}
感谢阅读!!!
【数据结构与算法】系列文章链接: 【数据结构与算法】递推法和递归法解题(递归递推算法典型例题)
【数据结构与算法】系列文章链接: 【数据结构与算法】C++的STL模板(迭代器iterator、容器vector、队列queue、集合set、映射map)以及算法例题
【数据结构与算法】系列文章链接: 【数据结构与算法】搜索算法(深度优先搜索 DFS和广度优先搜索 BFS)以及典型算法例题
【数据结构与算法】系列文章链接: 【数据结构与算法】二分查找算法
相关文章:
【数据结构与算法】贪心算法及例题
目录 贪心算法例题一:找零问题例题二:走廊搬运物品最优方案问题输入样例例题三:贪心自助餐 贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,以期望最终达到全局最优解的算法。它的核心思想是每次都选择当前最…...
【Origin+Python】使用External Python批量出图代码参考
目录 基本介绍环境配置官方代码示例基础代码详解我的代码效果视频进阶代码及去水印 基本介绍 origin2021后可以使用python实现批量绘图,一共有两种方式:一种是嵌入式Python,一种是外部Python访问Origin。详细介绍可以自己去查看,打…...
YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先!
YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先! DySample超轻量动态上采样算子全文戳这!here! 详细的改进教程以及源码&am…...
ChatGPT基础(二) ChatGPT的使用和调优
文章目录 ChatGPT的特性采用关键词进行提问给ChatGPT指定身份提升问答质量的策略1.表述方式上的优化2.用"继续"输出长内容3.营造场景4.由浅入深,提升问题质量5.预设回答框架和风格 ChatGPT的特性 1.能够联系上下文进行回答 ChatGPT回答问题是有上下文的&…...
麒麟 V10 离线 安装 k8s 和kuboard
目录 安装文件准备 主机准备 主机配置 修改主机名(三个节点分别执行) 配置hosts(所有节点) 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包(所有节点) 系统参数设置(所有节点) 时间同步…...
PlayerSettings.WebGL.emscriptenArgs设置无效的问题
1)PlayerSettings.WebGL.emscriptenArgs设置无效的问题 2)多个小资源包合并为大资源包的疑问 3)AssetBundle在移动设备上丢失 4)Unity云渲染插件RenderStreaming,如何实现多用户分别有独立的操作 这是第381篇UWA技术知…...
项目管理工具——使用甘特图制定项目计划的详细步骤
甘特图是一种直观的项目管理工具,它有助于我们清晰地展示任务安排、时间管理和项目的进度。以下是使用甘特图制定项目计划的详细步骤: 1、创建项目:首先,在进度猫中创建新的项目,并设置项目的时间、工作日等参数。根据…...
python读取文件数据写入到数据库中,并反向从数据库读取保存到本地
学python,操作数据库是必不可少的,不光要会写python代码,还要会写SQL语句,本篇文章主要讲如何把本地txt文件中的数据读取出来并写入到对应的数据库中,同时将数据库单个表中的数据读出来保存在本地txt文件中。 话不多说…...
社交媒体数据恢复:Viber
Viber是一款流行的即时通讯应用,用于发送消息、语音通话和视频通话。然而,有时候我们会不小心删除一些重要的Viber聊天记录,这时候就需要进行数据恢复。本文将介绍如何在安卓设备上进行Viber数据恢复。 一、使用安卓数据恢复软件 安卓数据恢…...
蓝桥杯赛事介绍
蓝桥杯是由工业和信息化部人才交流中心主办的全国性IT学科赛事,全称为“蓝桥杯全国软件和信息技术专业人才大赛”。该赛事旨在推动软件和信息领域专业技术人才培养,提升大学生的创新能力和就业竞争力,为行业输送具有创新能力和实践能力的高端…...
TypeScript系列之-深度理解基本类型画图讲解
JS的类型(8): null undefined string number boolean bigint symbol object(含 Array, Function,Date.....) TS的类型(87): 以上所有,加上 void, never, enum, unknown, any 再加上自定义类型 type interface 上一节我们说…...
Debian
使用root用户操作 直接使用su命令进行切换。 配置用户使用sudo命令 在安装好系统之后,使用用户名登录之后。需要执行需要root权限的命令,会发现无法执行成功。原因是没有配置用户使用sudo的权限。 编辑bash /etc/sudoers文件 可以先切换root用户安装…...
怎么使用JMeter进行性能测试?
一、简介 JMeter是Apache软件基金会下的一款开源的性能测试工具,完全由Java开发。它专注于对我们应用程序进行负载测试和性能测量,最初设计用于web应用程序,现在已经扩展到其他测试功能,比如:FTP、Database和LDAP等。…...
MySQL:锁的分类
文章目录 行级锁Record LockGap LockNext-Key Lock插入意向锁 表级锁表锁元数据锁(MDL)意向锁AUTO-INC 锁 全局锁 行级锁 Record Lock 记录锁有S锁(共享锁/读锁)和X锁(排他锁/写锁)之分,加完S…...
基于springboot实现房屋租赁管理系统设计项目【项目源码+论文说明】
基于springboot实现房屋租赁管理系统设计演示 摘要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对房屋租赁信息管理混乱&…...
揭秘Redis底层:一窥数据结构的奥秘与魅力
一、引言 Redis,以其高性能、高可靠、丰富的数据结构等特点,成为现代应用程序中不可或缺的缓存与存储组件。然而,Redis之所以能够实现如此卓越的性能,离不开其底层精巧的数据结构设计。本文将深入浅出地解析Redis底层五大核心数据…...
【网站项目】智能停车场管理系统小程序
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
芒果YOLOv5改进94:检测头篇DynamicHead为目标检测统一检测头:即插即用|DynamicHead检测头,尺度感知、空间感知、任务感知
该专栏完整目录链接: 芒果YOLOv5深度改进教程 该创新点:在原始的Dynamic Head的基础上,对核心部位进行了二次的改进,在 原论文 《尺度感知、空间感知、任务感知》 的基础上,在 通道感知 的层级上进行了增强,关注每个像素点的比重。 在自己的数据集上改进,有效涨点就可以…...
获奖名单出炉,OurBMC开源大赛总决赛圆满落幕
4 月 12 日,由开放原子开源基金会牵头、OurBMC 社区及理事长单位飞腾信息技术有限公司联合承办的 OurBMC 开源大赛总决赛在江苏宿迁圆满落幕。共有 10 支参赛队伍凭着初赛的优异表现进入决赛,在路演现场上演了一场精彩绝伦的对决。 江苏省工信厅软件和信…...
Qt配置外部库(Windows平台)
这里以C的外部库nlopt为例子来示范,右键工程选择添加库,然后选择库文件的目录(dll.a),会自动设置好包含路径(一般是include的目录),添加库(最下面一行) &…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
