【数据结构与算法】贪心算法及例题

目录

  • 贪心算法
      • 例题一:找零问题
      • 例题二:走廊搬运物品最优方案问题输入样例
      • 例题三:贪心自助餐

贪心算法

贪心算法是一种在每一步选择中都采取当前状态下最优的选择,以期望最终达到全局最优解的算法。它的核心思想是每次都选择当前最优解,而不考虑未来可能的情况。虽然贪心算法并不一定能够解决所有问题,但在一些特定情况下,它可以提供简单、高效的解决方案。

贪心算法适用于满足贪心选择性质和最优子结构性质的问题。贪心选择性质指的是每一步都选择当前最优解,而最优子结构性质指的是问题的最优解包含了子问题的最优解。

贪心算法的设计步骤通常包括:

  1. 确定问题的贪心选择性质: 需要明确每一步选择都是当前最优的特性。
  2. 构造解的候选集合: 根据贪心选择性质,确定每一步的选择范围。
  3. 确定选择的标准: 确定如何评价每个选择的优劣,并选择当前最优的解。
  4. 解决子问题: 通过递归或循环解决子问题。
  5. 合并子问题的解: 将各个子问题的解合并成原问题的解。

贪心算法是一种解决最优化问题的算法,其核心思想是在每一步选择中都采取当前状态下的最优选择,以期望最终达到全局最优解。相比之下,枚举法则是考虑所有可能情况,然后选出最优解。贪心算法与枚举法的不同之处在于贪心算法不进行回溯,而是在每个子问题中选择最优解后向下继续进行。

贪心算法主要适用于满足贪心选择性质的问题,即每一步选择都是局部最优解,最终得到的结果也是全局最优解的问题。贪心算法的设计步骤通常包括以下几个方面:

  1. 证明贪心选择性质: 证明问题的最优解可以通过一系列局部最优的选择得到。

  2. 将问题转化为贪心选择的形式: 将原问题转化为先做出选择,再解决剩下的子问题的形式。

  3. 求解子问题: 对每个子问题求解得到局部最优解。

  4. 合并子问题的解: 将子问题的局部最优解合并成原问题的解。

例题一:找零问题

在这里插入图片描述

输入:

在第一行给出测试例子个数 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

题目分析:

  1. 初步输入处理

    • 首先输入T表示测试用例的数量。
    • 然后循环处理每个测试用例,首先输入N表示搬运次数,然后输入每次搬运的起点和终点。
  2. 处理流程

    • 首先将起点和终点映射为走廊号,即通过 (房间号 - 1) / 2 计算出走廊号。
    • 确保起点比终点小,如果起点大于终点,则交换二者。
    • 统计每个走廊被占用的次数,并同时更新最大占用次数 maxAns
    • 输出最大占用次数乘以 10,即为最短时间。
  3. 时间复杂度:该算法的时间复杂度主要取决于循环次数,即搬运次数 N。在每次搬运中,涉及到的操作都是常数时间的,因此总体时间复杂度为 O(N)。

  4. 空间复杂度:该算法的空间复杂度主要取决于 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)以及典型算法例题
【数据结构与算法】系列文章链接: 【数据结构与算法】二分查找算法

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

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

相关文章

基于动态顺序表的应用——通讯录

文章目录 顺序表的应用——基于动态顺序表实现通讯录一、顺序表的文件&#xff1a;SeqList.hSeqList.c 二、通讯录的实现思路三、通讯录代码实现通讯录的初始化通讯录的销毁通讯录添加数据通过姓名查找联系人通讯录删除数据通讯录展示通讯录修改数据通讯录查找测试代码 四、所有…

永恒之蓝(ms17-010)复现

永恒之蓝 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子通过改造“永恒之蓝”制作了wannacry勒索…

计算机网络——CSMA/CD协议以及相关习题

目录 前言 引言 CSMA/CD协议 CSMA与CSMA/CD的区别 CSMA/CD流程 前言 本博客是博主用于复习计算机网络的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 引言 最早的以太网&#xff0c;许多计算机都连接在一根总线上工作——广播通信方式。 总线的特点想…

别让这6个UI设计雷区毁了你的APP!

一款成功的APP不仅仅取决于其功能性&#xff0c;更取决于用户体验&#xff0c;这其中&#xff0c;UI设计又至关重要。优秀的UI设计能够为用户带来直观、愉悦的交互体验&#xff0c;甚至让用户“一见钟情”&#xff0c;从而大大提高产品吸引力。 然而&#xff0c;有很多设计师在…

Python的基础知识学习路线2—运算符与变量类型(使用jupyter notebook进行操作:最全路线,每部分附有代码操作结果)

一、更改jupyter notebook 打开文件的位置 1、打开Anaconda Prompt终端&#xff0c;输入以下命令&#xff0c;创建配置文件&#xff1a;jupyter_notebook_config.py jupyter notebook --generate-config2、打开生成的配置文件 3、编辑配置文件jupyter_notebook_config.py&…

ssm045基于jsp的精品酒销售管理系统+jsp

精品酒销售管理系统 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于精品酒销售管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了精品酒销售管理系统&…

深度学习入门(2)

一。Matplotlib模块添加 Matplotlib是用于绘制图形的库&#xff0c;使用 Matplotlib 可以轻松地绘制图形和实现数据的可视化。 pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple 二、绘制简单图形 import numpy as np import matplotlib.pyplot as plt #…

三年了,期待下一个三年

第一个三年 时间好快&#xff0c;距离我发布我第一篇文章都已经三个年头了。 转眼也从大一新生变成了大四打工人。 在平台上发布博客&#xff0c;分享自己的项目、学习思路、解决的bug都带给我很多收获。 平台上的粉丝&#xff0c;阅读量等&#xff0c;也让我的简历更加出彩。…

约瑟夫问题---C++

今天来讲一道饶有名气的题目&#xff0c;约瑟夫问题 约瑟夫问题 这道题目有许多大佬用队列、递归、链表来解这道题目而这题的难度也确实非同小可&#xff01; 可是你们难道没有想过&#xff1f;用数组去解决吗&#xff1f;没错一维数组&#xff01;为了想出解决办法我掉了23根头…

Idea显示无法自动装配。找不到‘ xxx’类型的Bean

虽然只标红&#xff0c;不报错&#xff0c;但是看着非常别扭&#xff01; 原因&#xff1a; 当我们在使用Autowired注解的时候&#xff0c;默认requiredtrue,表示注入的时候bean必须存在&#xff0c;否则注入失败。 解决方案一&#xff1a; 在自动转配的注解后面添加(require…

Rockchip Android13 Vold(一):Native层

一:概述 Vold全称Volume Daemon是用于管理存储类设备的守护进程,负责接收驱动层设备挂载和卸载消息以及与Framework层之间的通信。Vold作为一个守护进程位于Android的Native Daemons层。 二:Vold框架图 三:Vold Sevice Android13的init.rc位于/system/etc/init/hw/其中使…

代码随想录第38天| 509. 斐波那契数 70. 爬楼梯

理论基础 刷题大纲&#xff1a; 动态规划5步曲&#xff1a; 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组 509. 斐波那契数 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.co…

JAVA 并发编程JUC 锁策略

锁策略 悲观锁乐观锁乐观锁的实现方式公平锁 vs 非公平锁 悲观锁 悲观锁总是假设最坏的情况&#xff0c;认为共享资源每次被访问的时候就会出现问题&#xff0c;例如共享数据被修改等&#xff0c;所以每次在获取资源操作的时候都会上锁&#xff0c;这样其他线程想拿到这个资源…

【03709】24年4月马克思主义基本原理概论考前密卷1

目录 1.选择题 2.简答题 3.论述题(三选二) 1.选择题

文章分享:《二代测序临床报告解读指引》

&#xff3b;摘要&#xff3d; 二代测序&#xff08;next generation sequencing&#xff0c;NGS&#xff09;已成为中国临床肿瘤医生常用检测工具&#xff0c;而中国超 90%临床医生需要 NGS 报告解读支持。因此&#xff0c;为提升临床医生 NGS 报告解读能力&#xff0c;特编写…

【MATLAB源码-第4期】基于MATLAB的1024QAM误码率曲线,以及星座图展示。

1、算法描述 正交幅度调制&#xff08;QAM&#xff0c;Quadrature Amplitude Modulation&#xff09;是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度&#xff08;π/2&#xff09;的正弦波&#xff0c;因此被称作正交载波。这种调制方式因此而得…

新天龙八部3永恒经典之江山策仿官方_源码架设教程

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 一. 效果演示 新天龙…

QAT量化 demo

一、QAT量化基本流程 QAT过程可以分解为以下步骤&#xff1a; 定义模型&#xff1a;定义一个浮点模型&#xff0c;就像常规模型一样。定义量化模型&#xff1a;定义一个与原始模型结构相同但增加了量化操作&#xff08;如torch.quantization.QuantStub()&#xff09;和反量化…

1分钟以上情感短视频素材去哪里找?推荐五个素材网站

在这个充斥着各种短视频的世界里&#xff0c;我就像是一名寻宝的冒险家&#xff0c;不断在素材的海洋中潜水&#xff0c;寻找那些能让我的视频金光闪闪的珍珠。让我告诉你&#xff0c;这不仅仅是一场寻宝&#xff0c;这简直是一场奇妙的冒险。九才素材网&#xff1a; 我的创作…

LeetCode题练习与总结:不同路径Ⅱ--63

一、题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从…