算法06 贪心算法【C++实现】

我们可以扮演一个贪心的人,在金子、银、铁中选择装入背包带走的话,作为一个贪心的人,肯定要把价值最大化,优先要选择装载价值较高的金子。

目录

什么是贪心算法

证明方法

常见题型

常见题型解法

训练:小木船过河

解题思路

参考代码

训练:救援物资

解题思路

参考程序

训练:会场安排

解题思路

参考代码


什么是贪心算法

贪心算法(greedy algorithm),是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑以后可能造成的影响。

可想而知,并不是所有的时候贪心法都能获得最优解,所以一般使用贪心法的时候,都要确保自己能证明其正确性。

证明方法

贪心算法有两种证明方法:反证法和归纳法。一般情况下,一道题只会用到其中的一种方法来证明。

反证法:如果交换方案中任意两个元素/相邻的两个元素后,答案不会变得更好,那么可以推定目前的解已经是最优解了。

归纳法:先算得出边界情况(例如n = 1)的最优解 F1,然后再证明:对于每个n,Fn+1都可以由 Fn推导出结果。

 

常见题型

最常见的贪心有两种。

我们将 XXX 按照某某顺序排序,然后按某种顺序(例如从小到大)选择。

我们每次都取 XXX 中最大/小的东西,并更新 XXX。(有时【XXX 中最大/小的东西】可以优化,比如用优先队列维护)

二者的区别在于一种是离线的,先处理后选择;一种是在线的,边处理边选择。

常见题型解法

排序解法:用排序法常见的情况是输入一个包含几个(一般一到两个)权值的数组,通过排序然后遍历模拟计算的方法求出最优值。

后悔解法:思路是无论当前的选项是否最优都接受,然后进行比较,如果选择之后不是最优了,则反悔,舍弃掉这个选项;否则,正式接受。如此往复。

训练:小木船过河

学校组织秋游的时候,小知和他的小伙伴准备乘坐小木船过河。

一只小木船最多只能乘坐两个人,且乘客的总重量不能超过小木船的最大承载量。为了尽量减少过河所需费用,所以小知希望找出可以让所有人过河的最少的小木船数量。现在给出小木船的最大承载量、过河总人数和每个人的重量。请你帮助小知计算出能让所有人过河的最少的小木船数量,并输出结果。

【输入描述】第一行有两个整数w,n,80<=w<=200,1<=n<=300,w为一条独木舟的最大承载量,n为人数;

接下来的一组数据为每个人的重量(不能大于船的承载量);

【输出描述】需要的最少独木舟的条数。

【输入样例1】85 6

5 84 85 80 84 83

【输出样例1】5

【输入样例2】100 5

50 50 90 40 60

【输出样例2】3

解题思路

为了能用最少的船帮助所有人过河,所以每次尽量运送最多的人是最好的。但是我们发现比较重的人有可能每次只能自己一个人过河,再加一个人重量就超过了最大载重。

于是我们就考虑到最佳的方案如下→

  • 对所有乘客体重升序(降序也可以)排序。
  • 因为一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量,所以先将升序的体重首尾(最轻和最重的)相加,如果不超过最大载重,两人坐一艘船,即最优解,那么下一组比较次轻的和次重的。但是如果超过最大载重,则最重的那人坐一艘船,将最轻的和次重的重复步骤2。
  • 别忘记最后,当次轻和次重是同一人时,他一人坐一艘船。

参考代码

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b){return a>b;
}int main(){int n,a[350],t=0,w;cin>>w>>n;int j=n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+1+n,cmp);int i=1;while(i<=j){if(a[i]+a[j]>w){t++;i++;}else if(a[i]+a[j]<=w){t++;i++;j--;}   }cout<<t;return 0;
}

训练:救援物资

小知开着他的卡车准备给灾区送一些救援物资,他的卡车最大载重量为M公斤,同时他购买了N种食品,有食盐,白糖,大米等。已知第 i 种食品的拥有Wi公斤,其商品价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。

【输入描述】第一行为卡车最大载重m公斤和n种食品;接下来每行表示第i种食品的重量Wi和价值Vi

【输出描述】输出总价值,结果保留两位小数

【输入样例】

10

3

3 4

4 5

2 6

【输出样例】44.00

解题思路

为了使装入卡车的货物价值最大,那么每次选取的必然是价值最大的货物。因此我们可以将每种货物的价值按照从大到小的顺序排序,然后每次依次选取价值大的货物。

在这之前需要判断重量是否超过承重,如果超过了,装满承重重量并结束,否则将货物全部装入,并且将车子承重减去已装入的重量,重复以上步骤直至结束。

参考程序

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct s{double w,v;//重量,价值
}a[105];bool cmp(s p,s q){return p.v>q.v;
}int main(){int m,n;cin>>m>>n;for(int i=1;i<=n;i++)cin>>a[i].w>>a[i].v;sort(a+1,a+n+1,cmp);double sum=0;for(int i=1;i<=n;i++){if(a[i].w<=m){sum+=a[i].w*a[i].v;m-=a[i].w;}else{sum+=m*a[i].v;break;}}printf("%.2f\n",sum);return 0;
}

训练:会场安排

ZY公司每天都有很多的会议要开,但是大会议室只有一个,如果有一个会议是在8点至9点开,则这个时间段不能安排别的会议,现在有一张会议安排计划的时间表,小知作为排班人员希望大会议室能够安排更多的会议,在保证更多会议的前提下,占用更少的时间以便会议室准备,请你来帮忙解决这个问题。

【输入描述】第一行输入n个会议(1<=n<=100),之后的每行分别记录这n个会议的开始和结束时间(整点,时间在0~24之间)。

【输出描述】第一行输出安排好之后的第一个会议的开始和结束时间;

第二行输出这间大会议室最多安排几个会议?

【输入样例】4

8 10

9 12

8 9

10 12

【输出样例】8 9

2

 

解题思路

解决这道题的思路是,我们先安排一个会议,再在安排了这个会议的前提下,在剩下的时间里尽可能多地安排其它会议。

这里我们不妨先安排整个会议室里的第一个会议,然后再在这个会议结束之后剩余的时间里安排尽可能多的会议。

这里正确的安排的方法是:

我们在安排完一个会议之后,要能使得剩下的时间尽可能多,这样就可以安排更多的会议。

所以我们每一次首先安排的会议是结束时间最早的那一个会议。因为结束时间最早的那个会议被先安排的话剩余时间是最多的。

 

参考代码

#include<iostream>
#include<algorithm>
using namespace std;struct s{int st,ed;
}a[110];bool cmp(s b,s c)
{if(b.ed!=c.ed)return b.ed<c.ed;return b.st>c.st;
}
int main()
{int n,t=0,j=0;cin>>n;for(int i=1;i<=n;i++)cin>>a[i].st>>a[i].ed;sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){if(a[i].st>=j){j=a[i].ed;t++;}}cout<<a[1].st<<" "<<a[1].ed<<endl<<t;return 0;
}

从入门到算法,再到数据结构,查看全部文章请点击icon-default.png?t=N7T8http://www.bigbigli.com/ 

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

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

相关文章

WARP 加速您的 AI 数据存储基础设施

你知道一些最好的人工智能模型的秘诀吗&#xff1f;这是他们可以访问的数据量&#xff0c;他们可以接受培训。对于 AI/ML 模型&#xff1a;快速访问数据为王。让我强调一下&#xff0c;这不仅仅是数据&#xff0c;而是快速访问的数据。如果有人可以构建更快、更强大的模型&…

骚操作:如何让一个网页一直处于空白情况?

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 如题&#xff0c;惯性思路很简单&#xff0c;就是直接撸上一个空内容的html。 注&#xff1a;以下都是在现代浏览器中执行&#xff0c;主要为**Chrome 版本 120.0.6099.217&…

在 The Sandbox 体验韩剧《碰撞搜查线》的刺激!

风靡全球的韩国电视剧《碰撞搜查线》现已登陆 The Sandbox 元宇宙&#xff01; ASTORY 的电视剧《碰撞搜查线》以充满动作喜剧色彩的方式&#xff0c;讲述了一个交通犯罪调查小组打击公路上的恶棍的故事。该剧迅速成为 Disney 最受欢迎的节目之一&#xff01; 在 The Sandbox体…

「动态规划」如何求最长递增子序列的长度?

300. 最长递增子序列https://leetcode.cn/problems/longest-increasing-subsequence/description/ 给你一个整数数组nums&#xff0c;找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其…

CAN通讯相关知识拆解报文格式过滤器数据交互

在嵌入式系统中使用CAN&#xff08;Controller Area Network&#xff09;通讯&#xff0c;需要掌握以下内容&#xff1a; CAN协议&#xff1a;了解CAN总线通讯的基本原理&#xff0c;包括帧格式、报文结构、消息ID等内容。CAN控制器&#xff1a;理解CAN控制器的工作原理以及如…

java连接mysql报错

1.背景&#xff0c;直接升级操作系统从centos-》国产化操作系统&#xff0c;mysql也升级到5.7.44 2&#xff0c;报错 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconn…

品牌策划背后的秘密:我为何对此工作情有独钟?

你是否曾有过一个梦想&#xff0c;一份热爱&#xff0c;让你毫不犹豫地投身于一个行业&#xff1f; 我就是这样一个对品牌策划充满热情的人。 从选择职业到现在&#xff0c;我一直在广告行业里“混迹”&#xff0c;一路走来&#xff0c;也见证了许多对品牌策划一知半解的求职…

适用于Mac的免费外置硬盘数据恢复软件

“我有一个 1 TB 的外置硬盘&#xff0c;它被意外格式化了。我尝试从中恢复丢失的数据。我把它连接到我的Mac&#xff0c;但里面什么也没找到。我正在寻找适用于Mac的免费外置硬盘数据恢复软件&#xff0c;例如奇客数据恢复Mac版或其他Mac数据恢复免费软件来扫描它并恢复数据。…

人工ai智能写作,分享推荐三款好用软件!

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;而在内容创作领域&#xff0c;AI智能写作软件更是如雨后春笋般涌现。今天&#xff0c;就为大家分享三款备受好评的AI智能写作软件&#xff0c;让你轻松掌握高效写作的秘密…

win10系统管理员账号怎么切换

1、按住“windowsx”&#xff0c;选择“计算机管理” 2、在页面左侧&#xff0c;找到“计算机管理(本地)”&#xff0c;展开“系统工具”&#xff0c;点击“本地用户和组”下面的“用户”&#xff0c;在右侧找到“Administrator”&#xff0c;双击打开。 3、在打开页面选择常规…

Docker(六)-本地镜像发布到私有库

1.下载镜像Docker Registry 用于搭建私人版本Docker Hub docker pull registry2.运行私有库Registry 运行私有库Registry&#xff0c;相当于本地有个私有Docker hubdocker run -d -p hostPort:containerPort -v 【宿主机目录】:【容器目录】 --privilegedtrue 【私有库镜像】…

泛微E9开发 根据判断条件,控制字段的编辑/必填属性

根据判断条件&#xff0c;控制字段的编辑/必填属性 1、需求说明2、实现方法3、扩展知识点1. 注册钩子事件&#xff0c;指定动作完成后触发1.1 接口名称及参数说明1.2 案例 2. 改变单个字段显示属性(只读/必填等)2.1 参数说明2.2 案例 1、需求说明 当字段“填报人”和字段“姓名…

android-aidl4

转&#xff1a;Android Aidl的使用_android aidl使用-CSDN博客 一.准备 Parcelable&#xff0c;可以理解成只是把car整个对象在aidl中进行传递&#xff0c;就理解成一个car的一个类吧&#xff0c;和其他类使用一样就行了&#xff0c;回调&#xff1a;把接口作为参数放在函数参…

Spring Boot集成Redisson

文章目录 Spring Boot集成Redisson1. Redisson概述2. Redission作用3. 集成Redission前提&#xff1a;步骤 1: 添加依赖步骤 2: 配置Redisson 4. 结论 Spring Boot集成Redisson 1. Redisson概述 Redisson是一个在Redis基础上实现的Java驻内存数据网格&#xff08;In-Memory D…

从广州到上海|荣载光的智慧 与SSHT共同探索智能照明更多想象空间

随着生活水平的提高&#xff0c;大众对高品质生活的追求脚步逐步加快&#xff0c;人们对智能照明的需求日益多样化&#xff0c;不再仅仅满足于传统的照明功能&#xff0c;而是转向智能照明系统&#xff0c;提出更高的需求。 展望未来&#xff0c;中国智能照明市场预计将迎来全…

文旅景区科技馆增加5D影院项目VR游乐场

王屋山风景名胜区增加20座5D影院设备&#xff0c;5D影院不像普通电影院&#xff0c;5D影院座椅可以根据影片播放内容&#xff0c;进行实时摆动和各种特效&#xff0c;闪电&#xff0c;振臀振臂&#xff0c;泡泡等个种特效。影片内容可以进行定制&#xff0c;根据景区文化风光&a…

AI交互及爬虫【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

k8s学习--chart包开发(创建chart包)

文章目录 chart包应用环境一、安装helm客户端工具二、chart包目录结构三、创建不可配置的chart1.创建目录和chart.yaml2.创建deployment.yaml3.创建service.yaml4.使用chart安装应用5.查看和验证 四、创建可配置的Chart1.官方的预定义变量2.新增values.yaml文件3.配置deploy引用…

网络安全协议

1. 概述 1.1 网络安全需求 五种需求&#xff1a; 机密性&#xff1a;防止数据未授权公开&#xff0c;让消息对无关听众保密 完整性&#xff1a;防止数据被篡改 可控性&#xff1a;限制对网络资源&#xff08;硬件和软件&#xff09;和数据&#xff08;存储和通信&#xff0…

计算机网络 交换机的安全配置

一、理论知识 1.交换机端口安全功能介绍 交换机端口安全功能是针对交换机端口进行安全属性的配置&#xff0c;以控制用户的安全接入。主要包括以下两种配置项&#xff1a; ①限制交换机端口的最大连接数&#xff1a;控制交换机端口连接的主机数量&#xff1b;防止用户进行恶…