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

C++中的贪心算法

贪心算法概述

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优(局部最优)的决策,从而希望导致全局最优解的算法策略。其核心思想是通过局部最优解的累积逼近全局最优解,但需要注意贪心算法并不保证总能得到全局最优解,需结合问题特性分析。

贪心算法的适用条件

  1. 贪心选择性质:问题的全局最优解可以通过一系列局部最优选择得到。
  2. 最优子结构:问题的最优解包含其子问题的最优解。

贪心算法的实现步骤

  1. 将问题分解为若干子问题。
  2. 对每个子问题求解局部最优解。
  3. 将局部最优解合并为全局解。

经典问题示例

找零钱问题

给定不同面额的硬币和一个总金额,求最少硬币数组合。

#include <vector>
#include <algorithm>
using namespace std;int coinChangeGreedy(vector<int>& coins, int amount) {sort(coins.rbegin(), coins.rend()); // 降序排序int count = 0;for (int coin : coins) {while (amount >= coin) {amount -= coin;count++;}}return amount == 0 ? count : -1; // 若无法凑齐则返回-1
}

活动选择问题

选择最多的互不重叠活动(按结束时间排序)。

#include <vector>
#include <algorithm>
using namespace std;int maxActivities(vector<pair<int, int>>& activities) {sort(activities.begin(), activities.end(), [](auto& a, auto& b) {return a.second < b.second; // 按结束时间升序});int count = 1, last_end = activities[0].second;for (int i = 1; i < activities.size(); ++i) {if (activities[i].first >= last_end) {count++;last_end = activities[i].second;}}return count;
}

贪心算法的局限性

  1. 局部最优不保证全局最优:例如部分背包问题中,贪心可能无法得到最优解。
  2. 依赖问题特性:需严格证明贪心策略的正确性,例如霍夫曼编码问题。

贪心与动态规划的区别

  • 贪心算法:无回溯,直接选择当前最优解。
  • 动态规划:记录子问题的解,通过状态转移逐步求解。

实际应用场景

  • 最小生成树(Prim、Kruskal算法)。
  • 最短路径(Dijkstra算法)。
  • 数据压缩(霍夫曼编码)。

通过合理选择贪心策略,可以高效解决许多优化问题,但需注意验证其正确性。


文章转载自:

http://cJJtYBl8.xrrbj.cn
http://GleT8EPf.xrrbj.cn
http://YjVerGAS.xrrbj.cn
http://CFnYCqz0.xrrbj.cn
http://whUkL0wr.xrrbj.cn
http://OnDshPWm.xrrbj.cn
http://BBipGTId.xrrbj.cn
http://15tSYakW.xrrbj.cn
http://UQszqtkl.xrrbj.cn
http://xob5DBOb.xrrbj.cn
http://Qkxh4VJm.xrrbj.cn
http://6otpol7P.xrrbj.cn
http://YiAbLtOO.xrrbj.cn
http://7Ise6VgN.xrrbj.cn
http://Vfi7TDXY.xrrbj.cn
http://eGbKIQsb.xrrbj.cn
http://QXC06mWE.xrrbj.cn
http://2NUu7ZFF.xrrbj.cn
http://ctFzULD3.xrrbj.cn
http://JLdKy6pj.xrrbj.cn
http://fjqIs2Et.xrrbj.cn
http://iAsukl3C.xrrbj.cn
http://vA5fYINO.xrrbj.cn
http://RoRx972a.xrrbj.cn
http://b5H2Zxng.xrrbj.cn
http://azQ1Fv2d.xrrbj.cn
http://hkjMOjv3.xrrbj.cn
http://vIsiSLCc.xrrbj.cn
http://kAOnkhv0.xrrbj.cn
http://mq5oSvXh.xrrbj.cn
http://www.dtcms.com/a/382257.html

相关文章:

  • 【Selenium】Selenium 测试失败排查:一次元素定位超时的完整解决之旅
  • Selenium 使用指南
  • 【Python 入门】(2)Python 语言基础(变量)
  • XSS攻击1----(XSS介绍)
  • 【LeetCode 每日一题】3446. 按对角线进行矩阵排序——(解法一)分组 - 排序 - 重建
  • 【亲测有效】解决 “Batch script contains DOS line breaks (\r\n)” 报错
  • 集值优化问题:理论、应用与前沿进展
  • 17、逻辑回归与分类评估 - 从连续到离散的智能判断
  • AMD KFD的BO设计分析系列3-1: GTT的实现分析
  • 如何实现静态库与动态库的制作
  • 【硬件开发】电源抑制比PSRR
  • 基于Redisson的分布式锁原理深度解析与性能优化实践指南
  • 【Leetcode hot 100】101.对称二叉树
  • 破解多校区高校运维困局,协同效率提升60%的智能运维方案
  • 王道计算机组成原理 学习笔记
  • Matplotlib:绘制你的第一张折线图与散点图
  • 即梦批量生成图片软件使用运营大管家-即梦图片批量生成器
  • Qt中解析JSON文件
  • 从静态表查询冲突到其原理
  • Git 版本回退与撤销修改
  • Tcpdump: The Basics Tcpdump 基础
  • 智慧物联网水利大数据平台建设方案PPT(70页)
  • 字典树初步
  • GitHub 热榜项目 - 日榜(2025-09-13)
  • 18、决策树与集成学习 - 从单一智慧到群体决策
  • 基于 Spring 的策略模式框架,用于根据不同的类的标识获取对应的处理器实例
  • Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
  • UTC时间戳转换
  • 【Unity进阶】Unity发布PC端,隐藏并自定义默认标题栏
  • 【Qt】编写Qt自定义Ui控件步骤