当前位置: 首页 > news >正文

14.贪心算法

一、算法内容

1.简介

贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择,而不考虑后续可能造成的影响。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

在贪心算法的应用当中,往往都会和排序联系起来,所以想要熟练使用贪心算法则必须首先能够熟练地应用排序。而由于贪心算法采取的是局部最优策略,故如果使用贪心算法之前往往需要证明算法的正确性,即证明在此题目/事件中,在每一步采取局部最优策略会得到整体最优的结果。

2.对比与联系

与此算法相对应的是后续我们会学到的动态规划,在动态规划中我们则必须要考虑一个选择对后续的影响。

贪心算法的应用非常广泛,很多其他的算法都需要贪心算法来作为基础。例如:哈夫曼编码、 K r u s k a l Kruskal Kruskal算法、 P r i m Prim Prim算法、 A ∗ A^* A算法等等。所以学好贪心算法是非常重要。

二、实例分析

1.最简单的例子

下面我们将以洛谷上的题目P1208为例,讲解贪心算法的最简单的使用方式。

(1)题目大意

  • 公司需要收购一定量的牛奶
  • 每一个奶农能卖出的牛奶的量和价格都不同
  • 公司希望能以最少的钱买到足够量的牛奶

(2)题目分析

显然按照题目意思,我们只需要将牛奶价格排序好,然后从价格低的开始买,如果此价格的牛奶已经没了,那么才购买价格更高的牛奶,一直买到满足公司收购的量为止即可。

本题目的贪心非常浅显易懂,这里不再给出证明。

(3)正解程序

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cstdio>using namespace std;
typedef long long ll;
const ll maxn=5010;
ll n,m,ans=0;
struct node
{ll per,num;
}farmer[maxn];
bool cmp(node x,node y)
{if(x.per!=y.per)return x.per<y.per;elsereturn x.num>y.num;
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=m;i++)scanf("%lld%lld",&farmer[i].per,&farmer[i].num);sort(farmer+1,farmer+1+m,cmp);ll pos=1;while(n){if(farmer[pos].num!=0){farmer[pos].num--;ans+=farmer[pos].per;n--;}elsepos++;}printf("%lld\n",ans);return 0;
}

2.稍微复杂一点的例子

下面我们将以洛谷上的题目P1094为例,讲解贪心算法的进一步应用,并给出证明的思路。

(1)题目大意

  • 有一组物品需要进行分组,每个物品都有一个价格
  • 希望保证每一组的价格总和小于某一固定值的情况下,使得分组数尽量小
  • 每一组最多包含两个物品

(2)题目分析

  • 首先我们能够想到,要使分组数尽可能小,那么一定是尽量两两组合
  • 所以我们很容易能够想到一个贪心思路,那就是将物品按价格从小到大排序,然后尽量用价格小的和价格大的进行组合。
  • 可以提前说明的是,这个贪心思路是正确的,然而问题并没有完全解决,为什么这样组合之后就能使得最后的分组数最小呢?

(3)贪心证明

  • 根据我们前面所讲到的点,将使用反证法证明

  • 设价格总和上限为 X X X,现有四个物品的价格为 v a , v b , v c , v d v_a,v_b,v_c,v_d va,vb,vc,vd,按从小到大排序

  • v a + v d ≤ X , v b + v c ≤ X v_a+v_d\leq X,v_b+v_c\leq X va+vdX,vb+vcX,此为贪心法得到的分组,最少分为两组。下面改变组合方式,因为 v a + v c ≤ X v_a+v_c\leq X va+vcX显然成立,所以仅考虑另一组的情况。

    • v b + v d ≤ X v_b+v_d\leq X vb+vdX,那么可以分为两组
    • v b + v d ≤ X v_b+v_d\leq X vb+vdX,那么仅能分为一组。因为 v a ≤ v b v_a\leq v_b vavb,所以此处情况完全可能出现。
  • v a + v d > X v_a+v_d> X va+vd>X则无论如何都只能分为一组

  • v a + v d ≤ X , v b + v c > X v_a+v_d\leq X,v_b+v_c> X va+vdX,vb+vc>X。下面考虑 v a + v c , v b + c d v_a+v_c,v_b+c_d va+vc,vb+cd这一种组合方式,显然 v b + v d > X v_b+v_d>X vb+vd>X,所以无论怎么分仍然只有一组。

  • 可以看到,非贪心的情况有可能导致答案数变少。例如 v a = 1 , v b = 5 , v c = 6 , v d = 8 , X = 11 v_a=1,v_b=5,v_c=6,v_d=8,X=11 va=1,vb=5,vc=6,vd=8,X=11

(4)正解程序

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cstdio>using namespace std;
typedef long long ll;
const ll maxn=1000010;
ll num[maxn],ans;
int main()
{ll n,w;scanf("%lld%lld",&w,&n);for(ll i=0;i<n;i++)scanf("%lld",&num[i]);sort(num,num+n);ll z=0,y=n-1;while(z<=y){if(num[z]+num[y]<=w){ans++;z++;y--;}else{y--;ans++;}}printf("%lld\n",ans);return 0;
}

三、作业

1.基础题

P1094 [NOIP2007 普及组] 纪念品分组

P1208 [USACO1.3]混合牛奶 Mixing Milk

P3817 小A的糖果

P5019 [NOIP2018 提高组] 铺设道路

2.提高题

P1056 [NOIP2008 普及组] 排座椅

P1199 [NOIP2010 普及组] 三国游戏

相关文章:

14.贪心算法

一、算法内容 1.简介 贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择&#xff0c;而不考虑后续可能造成的影响。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;只做出在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优…...

你知道营销人为什么要讲洞察吗?

用户洞察&#xff0c;是制定品牌和产品战略的基础&#xff0c;基于深刻的用户洞察&#xff0c;才能谈价值发现&#xff0c;目标规划&#xff0c;产品设计&#xff0c;全方位运营等。 可以这么说&#xff0c;没有洞察就没有营销&#xff0c;因为你的营销策略不能凭空想象&#…...

Neovim-配置教程

环境&#xff1a;Ubuntu 20.04 宿主机&#xff1a;windows &#xff08;windows terminal&#xff09;WSL2 NVIM&#xff1a;v0.10.0-dev 配置Neovim 需要保证流畅的github环境&#xff08;以便于快速拉取插件&#xff09;&#xff0c;可以使用代理或是配置Github SSH key 本文…...

Windows管理内存的3种方式——堆、虚拟内存、共享内存

一、操作系统管理内存概述 在 Windows 操作系统中&#xff0c;每个进程都被分配了 4GB 的虚拟地址空间&#xff0c;这被称为进程的虚拟地址空间。虚拟地址空间提供了一个抽象的地址空间&#xff0c;使得每个进程都可以认为它拥有自己的独立内存空间。这个虚拟地址空间被分为两…...

PCM/FM解调原理与Matlab算法仿真

调制的作用是将调制信息的频谱从低频搬移到高频,以适合信道传输。关于调制的原理,在上一节中已经讲过了。在这一节中,主要讲解FM的解调原理。与调制相对应的是在接收端需要解调过程将调制信息复原,所以解调是影响通信系统性能的重要技术。 解调方法按照是否需要载波恢复的…...

我的『1024』创作纪念日

目录 ◐机缘 ◑收获 ◐日常 ◑成就 ◐憧憬 记得&#xff0c;2020年07月22日我撰写了第1篇技术博客&#xff1a;《遗传算法实例解析》在这平凡的一天&#xff0c;我赋予了它不平凡的意义也许是立志成为一名专业T作者、也许是记录一段刚实践的经验但在那一刻&#xff0c;我已…...

Python ---> 衍生的数据技术

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 关于Python基本语法学习---->可以参考我的这篇博客&#xff1a;《我在VScode学Python》 随着人工智能技术的发展&#xff0c;挖掘和分析商业运用大数据已经成为一种推动应用&#xff0c; 推动社会发展起着…...

【27】linux进阶——rpm软件包的管理

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…...

HTTP第六讲——键入网址再按下回车,后面究竟发生了什么?

使用 IP 地址访问 Web 服务器 首先我们运行 www 目录下的“start”批处理程序&#xff0c;启动本机的 OpenResty 服务器&#xff0c;启动后可以用“list”批处理确认服务是否正常运行。 然后我们打开 Wireshark&#xff0c;选择“HTTP TCP port(80)”过滤器&#xff0c;再鼠标…...

layui目录和项目引入

1.目录结构如下 ├─css //css目录 │ │─modules //模块css目录&#xff08;一般如果模块相对较大&#xff0c;我们会单独提取&#xff0c;比如下面三个&#xff1a;&#xff09; │ │ ├─laydate │ │ ├─layer │ │ └─layim │ └─layui.css //核心样式文件…...

Ubuntu22.04 将EFI启动分区迁移到另一块硬盘

机器上有两块硬盘, 一块已经安装了Win10, 另一块新装Ubuntu22.04, 在新硬盘上划分分区的时候, 有分出256M给 BOOT EFI, 但是安装的时候没注意, 启动分区不知道怎的跑到 Windows 所在的硬盘上了 记录一下将 /boot/efi 分区迁移至 Ubuntu 所在硬盘, 并创建 Grub 的记录. 预留的…...

只要学会这些AI工具,一个人就是一家营销咨询公司

本教程收集于:AIGC从入门到精通教程 只要学会这些AI工具,一个人就是一家营销咨询公司 随着AI工具的不断涌现,您只需掌握市面上热门的AI工具,便可独自开展营销咨询公司。通过一系列AI工具,您可以为企业提供全案服务,收获丰厚回报。 例如,在协助一家美妆初创公司出海时,…...

[离散数学] 函数

文章目录 函数判断函数的条件复合函数复合函数的性质 逆函数 函数 判断函数的条件 dom F A ⇔ \Leftrightarrow ⇔所有x 都有 F&#xff08;x&#xff09;与之对应 有唯一的与其对应 < x , y > ∈ f ∧ < y , z > ∈ f ⇒ y z <x,y>\in f \land <y,z…...

好家伙,又一份牛逼笔记面世了...

最近网传的一些裁员的消息&#xff0c;搞的人心惶惶。已经拿到大厂offer的码友来问我&#xff1a;大厂还能去&#xff0c;去了会不会被裁。 还在学习的网友来问我&#xff1a;现在还要冲互联网么&#xff1f; 我是认为大家不用恐慌吧&#xff0c;该看啥看啥&#xff0c;该学啥…...

基于nodejs+vue3 的高仿网易云音乐

大家好&#xff0c;我是小寻&#xff0c;欢迎大家关注我的公众号&#xff1a;工具优选&#xff0c;加入前端、java群聊哦&#xff01; 今天给大家分享一个超高水准的项目&#xff1a;基于nodejsvue3研发的高仿网易云音乐&#xff0c;项目内容出自寻码网&#xff01; 技术栈&a…...

MySQL数据库用户管理以及数据库用户授权

一、数据库用户管理 1、新建用户 CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码]; ---------------------------------------------------------------------------------------------------------- 用户名&#xff1a;指定将创建的用户名 来源地址&#xff1a…...

全面分析生物技术的优缺点以及应用场景

一、 引言 生物识别技术具有不可撤销性、高度便利性和较低错误率等优势&#xff0c;在安全领域中也备受瞩目。然而&#xff0c;对于生物识别技术在应对安全挑战方面的可靠性和有效性&#xff0c;但争议并未被完全解决 二、生物识别技术的介绍 所谓生物识别技术就是&#xff0c;…...

OpenAI是什么?

OpenAI是一家人工智能技术公司&#xff0c;成立于2015年&#xff0c;总部位于美国旧金山。它的创始人包括埃隆马斯克等多名知名人士&#xff0c;公司的目标是推进人工智能技术的发展&#xff0c;同时确保人工智能的发展不会对人类造成负面影响。 OpenAI在研究和开发各种人工智能…...

量子计算——新兴领域的前沿技术

随着人类社会文明的不断进步&#xff0c;计算技术也在不断发展。传统计算机在过去的几十年中快速发展&#xff0c;计算速度、存储能力等方面发生了天翻地覆的变化。但随着大数据、人工智能、区块链等新兴领域的迅速崛起&#xff0c;传统计算机的发展似乎面临了瓶颈。在这样的背…...

.Net平台下OpenGL绘制图形(1)(VS2019,Winform,C#)

1、介绍 OpenGL&#xff08;英语&#xff1a;Open Graphics Library&#xff0c;译名&#xff1a;开放图形库或者“开放式图形库”&#xff09;是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口&#xff08;API&#xff09;。这个接口由近350个不同的函数调用组成…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...