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

news2024/11/18 14:31:41

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

目录

什么是贪心算法

证明方法

常见题型

常见题型解法

训练:小木船过河

解题思路

参考代码

训练:救援物资

解题思路

参考程序

训练:会场安排

解题思路

参考代码


什么是贪心算法

贪心算法(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.coloradmin.cn/o/1858591.html

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

相关文章

富士施乐M268DW加粉清零方法

基本参数&#xff1a; 品牌型号&#xff1a;富士施乐(Fuji Xerox) M268DW 产品类型&#xff1a;A4黑白激光多功能一体机&#xff08;三合一&#xff09;&#xff0c;打印、复印、扫描 打印情况&#xff1a;30张/分&#xff0c;1200dpi最大分辨率&#xff0c;64M内存 最大月…

Tomcat多实例配置

目录 一. 复制程序文件 二. 启动tomcat多实例 三. Tomcat多实例负载均衡 多实例&#xff08;多进程&#xff09;&#xff1a;同一个程序启动多次&#xff0c;分为两种情况: 第一种&#xff1a;一台机器跑多个站点&#xff1b; 第二种&#xff1a;一个机器跑一个站点多个实…

JeecgFlow并行网关概念及案例演示

概念讲解 并行网关能够在一个流程中用于进行并发建模处理&#xff0c;将单条线路拆分成多条路径并行执行&#xff0c;或者将多条路径合并处理。 在一个流程模型中引入并发最直接的网关就是并行网关&#xff0c;它基于进入和外出顺序流&#xff0c;有分支和合并两种行为&#xf…

存储无界限:MK米客方德SD NAND系列,小容量到大容量的全方位覆盖

在这个数字化飞速前进的时代&#xff0c;数据存储的需求日益增长&#xff0c;不同的应用场景对存储容量的要求也各不相同。MK米客方德公司以其SD NAND系列产品&#xff0c;凭借其广泛的容量覆盖&#xff0c;从1Gb到512Gb&#xff0c;为各种应用场景提供了完美的存储解决方案。今…

AWS WAF 中的验证码和挑战 | 网页抓取时如何解决这个问题

正如许多企业或爬虫用户所知&#xff0c;AWS WAF&#xff08;Web 应用防火墙&#xff09;是一个强大的安全解决方案&#xff0c;旨在保护 Web 应用免受常见的网络攻击和漏洞。其关键功能之一是使用 CAPTCHA 和挑战来区分合法用户和潜在的恶意机器人。虽然这增强了安全性&#x…

session 共享、Nginx session 共享、Token、Json web Token 【JWT】等认证

.NET JWT JWT 》》Json Web Token header . payload . Signature 三部分组成 JWT 在线生成 》》 https://jwt.io/ 》》https://tooltt.com/jwt-encode/ 》》解码工具 https://tool.box3.cn/jwt.html JWT 特点 无状态 JWT不需要在服务端存储任何状态&#xff0c;客户端可以携…

华为开发者大会闪耀东莞,康佳电视携手海思惊艳亮相

近日&#xff0c;华为开发者大会&#xff08;HDC2024&#xff09;在东莞松山湖举行。 作为电视领域唯一受邀参展的品牌&#xff0c;康佳电视以其优秀的创新实力&#xff0c;携手华为海思共同展示了基于OpenHarmony Standard层级的鸿鹄媒体创新方案。该方案不仅能够为用户带来更…

网络构建关键技术_1.网络高可用设计

1.网络高可用性概述 随着网络快速发展及应用日益深入&#xff0c;各种核心和增值业务在网络上广泛部署&#xff0c;网络的作用愈来愈凸显出来。即使网络出现短时间中断&#xff0c;都可能对业务带来比较大的影响&#xff0c;甚至给企业造成一定程度的经济损失。因此&#xff0c…

LeetCode 算法:对称二叉树 c++

原题链接&#x1f517;&#xff1a;对称二叉树 难度&#xff1a;简单⭐️ 题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;ro…

FreeRTOS实时操作系统

1.认识实施操作系统 1.1 裸机和实时操作系统 裸机&#xff1a; 早期嵌入式开发没有嵌入式操作系统的概念&#xff0c;直接操作裸机&#xff0c;在裸机上写程序&#xff0c;比如用51单片机基本就没有操作系统的概念。 通常把程序设计为前后台系统&#xff0c;主要分为两部分&a…

路由(urls)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Django的URL路由流程&#xff1a; l Django查找全局urlpatterns变量&#xff08;urls.py&#xff09;。 l 按照先后顺序&#xff0c;对URL逐一匹…

我做个人站长 7 年的经验,最痛的莫过于。。

大家好&#xff0c;我是程序员鱼皮&#xff0c;从大学期间上线个人博客网站开始&#xff0c;我做个人站长已经有 7 年多了。在这个过程中&#xff0c;我收获了很多&#xff0c;除了技术成长带来的快乐外&#xff0c;个人站长最开心的莫过于有用户使用、并且留下好评&#xff0c…

数据库精选题(七)(综合模拟题二)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据库 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 一、名词解释 1、事务 2、弱实体集 3、正…

顶尖项目经理都在用的SOP

接受任务SOP 了解任务背景了解任务目标&#xff08;包含deadline&#xff09;拆解任务&#xff0c;确认负责人执行方案审批确认跟进执行并定期汇报验收结果&#xff0c;进行反馈相关文档存档&#xff0c;形成闭环 推进任务SOP - PDCA循环 制定计划 Plan。依据目标&#xff0c…

【面试题】面试小技巧:如果有人问你 xxx 技术是什么?_面试问你对什么技术特别了解

前端工程越来越大&#xff0c;前面几种方案不能很好的支持单元测试。 在这样的背景下&#xff0c;React 诞生了。React 带来了新的思维模式&#xff0c;UI fn(props)&#xff0c;React 中一个组件就是一个函数或者一个类&#xff0c;一个函数或者一个类就是一个基础单位&…

OpenFeign 的请求处理流程

流程 1. 定义 Feign 客户端接口 首先&#xff0c;开发者需要定义一个 Feign 客户端接口&#xff0c;并使用 FeignClient 注解进行配置。例如&#xff1a; FeignClient(name "aService", url "http://localhost:8080") public interface ServiceProvid…

数据库 复习题

有一个关系模式&#xff1a;工程关系&#xff08;工程号&#xff0c;工程名称&#xff0c;职工号&#xff0c;姓名&#xff0c;聘期&#xff0c;职务&#xff0c;小时工资率&#xff0c;工时&#xff09;&#xff0c;公司按照工时和小时工资率支付工资&#xff0c;小时工资率由…

【面试题】马上金九银十了,简历该准备起来了,面试题你准备好了吗 ?浅谈 JS 浅拷贝和深拷贝

代码展示 let obj_old {name: Tom,age: 15,favorite: {food: bread,drink: milk} } let obj_new {...obj_old} console.log(obj_old obj_new) // false console.log(obj_old.name obj_new.name) // true console.log(obj_old.favorite obj_new.favorite) // true3. Ar…

什么是档案业务建设评价

档案业务建设评价是对档案管理机构或部门在档案业务建设方面进行的评估和考核。评价主要根据一定的评价标准和指标&#xff0c;对档案业务的各个方面进行综合评估&#xff0c;包括档案收集、整理、保管、利用等环节&#xff0c;以及档案管理机构的组织管理、技术能力等方面。 评…

OnlyOffice:现代办公的最佳选择

目录 安装 使用 评价 对比&#xff08;与WPS&#xff09; 总结 在当今的数字化办公时代&#xff0c;选择一款功能全面且易于使用的办公软件至关重要。OnlyOffice作为一款现代化的办公软件&#xff0c;凭借其强大的功能和友好的用户体验&#xff0c;逐渐成为了众多企业和个…