C语言中的贪心算法
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优解的算法,希望通过局部最优解的选择,最终得到全局最优解。它常用于解决最优化问题,如最小生成树、最短路径等。本文将从理论到实践,逐步引导初学者掌握贪心算法在 C 语言中的实现。
什么是贪心算法?
贪心算法的核心是 贪心选择性质 和 最优子结构:
- 贪心选择性质:每次选择当前看起来最优的解。
- 最优子结构:问题的最优解可以通过子问题的最优解合并得到。
举个例子:假如你需要用最少的硬币找零,每次选择最大面值的硬币就是贪心的思路。
贪心算法的适用场景
贪心算法并不总是能找到全局最优解,适用场景包括:
- 最小生成树问题(如 Prim、Kruskal 算法)
- 活动选择问题
- 最短路径问题(如 Dijkstra 算法,虽然不是纯贪心,但核心思想类似)
贪心算法的实现步骤
以下是实现贪心算法的通用步骤:
- 分析问题是否满足贪心选择性质和最优子结构。
- 排序:根据特定规则对问题的元素进行排序(通常需要一个比较函数)。
- 逐步选择:从头开始,选择符合条件的元素,直到满足目标。
- 验证结果:确保结果满足问题的要求。
示例:活动选择问题
问题描述
给定一组活动,每个活动有一个开始时间和结束时间。你需要选择尽可能多的活动,且这些活动之间不能重叠。
贪心思路
- 按活动的结束时间升序排序(结束得越早,留给后续活动的时间越多)。
- 依次选择每个活动,如果它的开始时间不早于上一个已选活动的结束时间,则选择它。
C语言实现
以下是活动选择问题的 C 语言实现代码:
#include <stdio.h>
#include <stdlib.h>// 定义活动结构体
typedef struct {int start;int end;
} Activity;// 比较函数,用于按结束时间排序
int compare(const void *a, const void *b) {Activity *activity1 = (Activity *)a;Activity *activity2 = (Activity *)b;return activity1->end - activity2->end;
}// 贪心算法选择活动
void selectActivities(Activity activities[], int n) {// 按结束时间排序qsort(activities, n, sizeof(Activity), compare);printf("选择的活动如下:\n");int lastEndTime = 0;for (int i = 0; i < n; i++) {if (activities[i].start >= lastEndTime) {printf("活动[%d]: 开始时间 = %d, 结束时间 = %d\n", i + 1, activities[i].start, activities[i].end);lastEndTime = activities[i].end;}}
}int main() {Activity activities[] = {{1, 3},{2, 5},{4, 6},{6, 7},{5, 9},{8, 9}};int n = sizeof(activities) / sizeof(activities[0]);selectActivities(activities, n);return 0;
}
代码分析
- 数据结构:用
struct
定义活动的开始和结束时间。 - 排序:用
qsort
对活动按结束时间升序排列。 - 贪心选择:逐一遍历排序后的活动,如果活动的开始时间不与上一次选择的活动冲突,就将其加入结果。
输入输出示例
输入活动:
- 活动1:开始时间=1,结束时间=3
- 活动2:开始时间=2,结束时间=5
- 活动3:开始时间=4,结束时间=6
- 活动4:开始时间=6,结束时间=7
- 活动5:开始时间=5,结束时间=9
- 活动6:开始时间=8,结束时间=9
输出活动:
选择的活动如下:
活动[1]: 开始时间 = 1, 结束时间 = 3
活动[3]: 开始时间 = 4, 结束时间 = 6
活动[4]: 开始时间 = 6, 结束时间 = 7
活动[6]: 开始时间 = 8, 结束时间 = 9
总结
- 贪心算法的核心是找到局部最优解,逐步逼近全局最优解。
- 关键在于分析问题是否适合贪心策略,排序规则是实现的基础。
- 通过活动选择问题,初学者可以掌握贪心算法的基本思想。
尝试多练习一些经典的贪心问题,如背包问题、最短路径问题等,你会发现贪心算法是一种高效且优雅的解决问题方法!
相关文章:
C语言中的贪心算法
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优解的算法,希望通过局部最优解的选择,最终得到全局最优解。它常用于解决最优化问题,如最小生成树、最短路径等。本文将从理论到实践,逐步引导…...

虚幻引擎结构之UWorld
Uworld -> Ulevel ->Actors -> AActor 在虚幻引擎中,UWorld 类扮演着至关重要的角色,它就像是游戏世界的总指挥。作为游戏世界的核心容器,UWorld 包含了构成游戏体验的众多元素,从游戏实体到关卡设计,再到物…...
太通透了,Android 流程分析 蓝牙enable流程(stack/hidl)
零. 前言 由于Bluedroid的介绍文档有限,以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等),加上需要掌握的语言包括Java/C/C++等,加上网络上其实没有一个完整的介绍Bluedroid系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员…...
2.微服务灰度发布落地实践(agent实现)
前言 据上一篇,设计方案的分析,综合考虑,最终决定,客户端采用agent方案实现,具本原因不再赘述, 感觉兴趣的小伙伴可以回头了解一下.该篇主要讲java agent的实现,灰度agent客户端的基础框架实现 java agent的介绍 ja…...

搭建医疗客服知识库:智慧医疗的基石
在医疗行业,客服知识库不仅是提供患者咨询和支持的平台,更是提升医疗服务效率和质量的关键工具。 1. 明确知识库的目标和价值 构建医疗行业客服知识库的首要任务是明确其目标和价值。这包括提供患者教育、辅助临床决策、优化患者服务流程等。明确目标后…...

CES Asia 2025的低空经济展区有哪些亮点?
CES Asia 2025(赛逸展)的低空经济展区有以下亮点: • 前沿科技产品展示: 多款新型无人机将亮相,如固定翼无人机和系留无人机的最新型号,其在监测、救援和货物运输等方面功能强大。此外,还有可能…...
Java/Spring项目包名为何以“com”开头?
文章目录 包名的基本概念域名反转规则历史背景包名的结构实际应用总结 在Java和Spring项目中,我们常常看到包名以“com”开头,比如com.example.project。这种命名方式看似简单,其实背后蕴含着不少学问。今天,我们就来聊聊这个话题…...

影刀进阶应用 | 知乎发布想法
文章目录 影刀进阶应用 | 知乎发布想法一、流程流程解释: 二、单条想法发布2.1 素材生产2.2 **进入发布流程**2.3 **输入文本**2.4 插入图片2.5 发布查看 三、批量发布 影刀进阶应用 | 知乎发布想法 一、流程 流程解释: 素材生产 :用AI生成待…...
v-if 和 v-for 优先级
一、优先级规则 在 Vue.js 中,v-for的优先级比v-if高。这意味着当它们同时出现在一个元素上时,v-for会首先被解析和执行。 <div v-for"item in items" v-if"shouldShow(item)">{{ item }}</div> 二、可能导致的问题 …...

【数据结构与算法】单向链表
一、什么是链表 链表由一系列节点组成,每个节点都包含一个 data 域(存放数据)和一个 next 域(指向下一节点)。链表中的节点可以按照任意顺序存放在内存中,它们之间并不连续。每个节点都记录了下一个节点的地…...
网络编程UDP—socket实现(C++)
网络编程UDP—socket实现 前言UDP客户端和服务端UDP使用场景UDP socket C代码示例服务端接收数据示例(bindrecvfrom 阻塞式接收信息):bind 绑定-监听 函数为什么一般都是监听所有网络接口呢?为什么需要用inet_addr进行转换&#x…...

系统思考—冰山模型
“卓越不是因机遇而生,而是智慧的选择与用心的承诺。”—— 亚里士多德 卓越,从来不是一次性行为,而是一种习惯。正如我们在日常辅导中常提醒自己:行为的背后,隐藏着选择的逻辑,而选择的根源,源…...
MySQL 中存储金额数据一般使用什么数据类型
在 MySQL 中存储金额数据时,应该谨慎选择数据类型,以确保数据的精度和安全性。以下是几种常用的数据类型及其适用性: DECIMAL 类型: 描述:DECIMAL 类型是专门为存储精确的小数而设计的。它可以指定小数点前后的数字位数…...

Excel中一次查询返回多列
使用Excel或wps的时候,有时候需要一次查询返回多列内容,这种情况可以选择多次vlookup或者多次xlookup,但是这种做法费时费力不说,效率还有些低下,特别是要查询的列数过多时。我放了3种查询方法,效果图&…...
Java中各种数组复制方式的效率对比
在 Java 中,数组复制是一个常见的操作,尤其是在处理动态数组(如 ArrayList)时。Java 提供了多种数组复制的方式,每种方式在性能和使用场景上都有所不同。以下是对几种主要数组复制方式的比较,包括 System.a…...
STM32 FLASHdb
FlashDB是一款超轻量级的嵌入式数据库,专注于为嵌入式产品提供数据存储方案。以下是对STM32 FlashDB的详细介绍: 一、主要特性 资源占用极低:FlashDB的内存占用几乎为0,非常适合资源有限的嵌入式系统。支持多分区、多实例&#…...
【漏洞复现】Struts2(CVE-2024-53677)任意文件上传逻辑绕过漏洞
文章目录 前言一、漏洞描述二、漏洞详情三、影响版本四、危害描述五、漏洞分析六、漏洞复现七、修复建议前言 Struts2框架是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java Servlet API,鼓励开发者采用MVC架构。Struts2以WebWork优秀的设…...

图的最短路径(C++实现图【4】)
目录 1. 最短路径 1.1单源最短路径--Dijkstra算法 代码实现 1.2 单源最短路径--Bellman-Ford算法 代码实现 1.3 多源最短路径--Floyd-Warshall算法 代码实现 1. 最短路径 最短路径问题:从在带权有向图G中的某一顶点出发,找出一条通往另一顶点的最短路径&…...

Pandas01
文章目录 内容简介1 常用数据分析三方库2 Jupyter notebook3 Series的创建3.1 通过Numpy的Ndarray 创建一个Series3.2 通过列表创建Series 4 Series的属性和方法4.1 常用属性4.2 常用方法4.3 布尔值列表筛选部分数据4.4 Series 的运算 5 DataFrame的创建通过字典创建通过列表[元…...
opencl 封装简单api
这是cl代码 kernel.c __kernel void add_one(__global float *output,__global float* pnum) {int xget_global_id(0);output[x]pnum[0]; } c代码 #include <CL/cl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include<st…...
81 实战一:给root目录扩容
添加一块100G硬盘 vgextend centos /dev/sdb1 /dev/sdc lvextend -L +120G /dev/centos/root xfs_growfs /dev/centos/root df -h 看是否扩容成功 82 实战二:给swap空间扩容 添加一块20G硬盘 fdisk -l 可以看到新添加的硬盘 vgextend centos /dev/sdd …...

Ubuntu20.04基础配置安装——系统安装(一)
引言: 工作需要,Ubuntu的各类环境配置,从23年开始使用Ubuntu20.04之后,尽管能力在不断提升,但是依旧会遇到Ubuntu系统崩掉的情况,为了方便后续系统出现问题及时替换,减少从网上搜索资源进行基础…...

测试W5500的第11步_使用ARP解析IP地址对应的MAC地址
本文介绍了基于W5500芯片的ARP协议实现方法,详细阐述了ARP请求与回复的工作机制。ARP协议通过广播请求和单播回复实现IP地址与MAC地址的映射,确保局域网设备间的可靠通信。文章提供了完整的STM32F10x开发环境下的代码实现,包括网络初始化、SP…...
Qt 5.12 上读取 .xlsx 文件(Windows 平台)
推荐最优方案:使用 QXlsx 库 QXlsx 是一个基于 Qt 的开源库,专门用于读写 .xlsx 文件,适用于 Qt 5.12,且无需依赖 Microsoft Excel 或 COM 对象。以下是其优势与实现步骤: 优势 跨平台:QXlsx 不依赖 Mic…...

WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验
一、WAF绕过文件上传漏洞 win7:10.0.0.168 思路:要想要绕过WAF,第一步是要根据上传的内容找出来被拦截的原因。对于文件上传有三个可以考虑的点:文件后缀名,文件内容,文件类型。 第二步是根据找出来的拦截原…...

【行驶证识别成表格】批量OCR行驶证识别与Excel自动化处理系统,行驶证扫描件和照片图片识别后保存为Excel表格,基于QT和华为ocr识别的实现教程
在车辆管理、物流运输、保险理赔等领域,经常需要处理大量的行驶证信息。传统的人工录入方式效率低、易出错,而使用 OCR 技术可以自动识别行驶证图片中的文字信息,极大提高数据处理效率。该系统可以应用于以下场景: 保险公司快速…...

Deepseek/cherry studio中的Latex公式复制到word中
需要将Deepseek/cherry studio中公式复制到word中,但是deepseek输出Latex公式,比如以下Latex代码段,需要通过Mathtype翻译才能在word中编辑。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…...
32单片机——窗口看门狗
1、WWDG的简介 WWDG:Window watchdog,即窗口看门狗 窗口看门狗本质上是能产生系统复位信号和提前唤醒中断的递减计数器 WWDG产生复位信号的条件: (1)当递减计数器值从0x40减到0x3F时复位(即T6位跳变到0&a…...
Java集合初始化:Lists.newArrayList vs new ArrayList()
文章目录 前言一、核心区别全景图二、代码实现深度对比1. 初始化方式对比2. 容量预分配机制 三、性能与底层原理1. 内存分配策略2. 基准测试数据(JMH) 四、Guava的进阶功能生态1. 集合转换2. 集合分片3. 不可变集合创建 五、最佳实践指南六、源码级实现解…...

明基编程显示器终于有优惠了,程序员快来,错过等一年!
最近618的活动已经陆续开始了,好多人说这是买数码产品的好时候,作为一名资深程序员,我做了不少功课,决定给自己升级办公设备,入手明基 RD 系列的显示器,这是市面上首家专注于我们程序员痛点和需求的产品&am…...