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

贪心算法:用局部最优解迈向全局最优的艺术

贪心算法:用局部最优解迈向全局最优的艺术

什么是贪心算法?

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。它不像动态规划那样考虑所有可能的子问题,而是局部最优,希望全局最优

贪心算法的适用场景

贪心算法适用于满足以下两个条件的问题:

  1. 贪心选择性质:局部最优选择能导致全局最优解

  2. 最优子结构:问题的最优解包含其子问题的最优解

经典问题与C++实现

1. 找零钱问题(硬币问题)

问题描述:给定不同面额的硬币和一个总金额,求最少硬币数。

#include <iostream>
#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;
}

int main() {
vector<int> coins = {1, 5, 10, 20, 50, 100};
int amount = 123;

int result = coinChangeGreedy(coins, amount);
if (result != -1) {
cout << "找零 " << amount << " 元需要最少 " << result << " 枚硬币" << endl;
} else {
cout << "无法找零" << endl;
}

return 0;
}

2. 区间调度问题

问题描述:给定多个会议的开始和结束时间,求最多能参加多少个不冲突的会议。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Interval {
int start;
int end;
};

bool compare(Interval a, Interval b) {
return a.end < b.end; // 按结束时间升序排序
}

int maxMeetings(vector<Interval>& meetings) {
if (meetings.empty()) return 0;

// 按结束时间排序
sort(meetings.begin(), meetings.end(), compare);

int count = 1; // 第一个会议总是可以参加
int lastEnd = meetings[0].end;

for (int i = 1; i < meetings.size(); i++) {
if (meetings[i].start >= lastEnd) {
count++;
lastEnd = meetings[i].end;
}
}

return count;
}

int main() {
vector<Interval> meetings = {
{1, 3}, {2, 4}, {3, 6}, {5, 7}, {8, 9}
};

int result = maxMeetings(meetings);
cout << "最多可以参加 " << result << " 个会议" << endl;

return 0;
}

http://www.cnnetsun.cn/news/72145.html

相关文章:

  • 分布式消息队列kafka【四】—— 消费者进阶提升
  • HunyuanVideo-Foley实战教程:结合HTML与JavaScript实现实时音效预览
  • 5步部署WVP-GB28181-Pro:开源国标平台的终极指南
  • X-TRACK 3D打印外壳DIY实战:从零打造专业级GPS自行车码表
  • 浏览器串口助手终极指南:零安装调试嵌入式设备
  • gpt-oss-20b与ChatGLM-6B在中文场景下的对比实验
  • 安装包体积压缩秘籍:基于vLLM的精简镜像制作
  • ZonyLrcToolsX歌词下载教程:5分钟学会跨平台音乐歌词管理
  • 终极指南:5个OpenFace面部行为分析实战技巧
  • Maven项目如何引入FLUX.1-dev?Java开发者必看集成方案
  • EasyAdmin8终极指南:5分钟构建企业级后台管理系统的完整解决方案
  • 微信小程序表格组件终极指南:5分钟快速上手miniprogram-table-component
  • PySide6 的 QSettings简单应用学习笔记
  • 使用LangChain编排Seed-Coder-8B-Base实现自动化脚本生成
  • 谷歌学术镜像网站资源助力gpt-oss-20b研究论文查阅
  • 抖音直播内容高效保存指南:告别错过精彩瞬间的烦恼
  • 泉盛UV-K5/K6对讲机LOSEHU固件:5大升级功能与终极配置方案
  • 跨平台应用性能深度剖析:Electron 与开源鸿蒙(OpenHarmony)在真实业务场景下的资源调度、启动效率与能效表现对比
  • 广东深圳一家IPO企业重度依赖单一客户,产品结构单一竞争力存疑
  • APK Pure是否适合发布Qwen3-14B移动端应用?可行性分析
  • AutoDock Vina批量分子对接终极指南:从效率瓶颈到高效实战突破
  • 基于Qwen3-32B构建高质量内容生成系统的完整指南
  • 企业微信智能表格高效计算工作人天:日 / 周 / 月全维度公式 + 实操指南
  • RTL8852BE无线网卡驱动:让Linux连接更稳定的终极方案
  • 5分钟快速上手Vue时间轴组件:timeline-vuejs完整使用指南
  • HunyuanVideo-Foley模型调优技巧:降低Token使用量,提升生成效率
  • 基于单片机电机功率测量系统Proteus仿真(含全部资料)
  • MATLAB从零开始实现粒子群优化算法PSO
  • Stable Diffusion 3.5 FP8高分辨率输出实测:1024×1024图像生成全记录
  • 云端部署DeepSeek + 本机Cherry Studio接入