【算法】贪心算法

贪心算法

1. 贪心介绍

贪心算法 总是做出当前选择 ,期望通过局部最优 选择得到全局最优的解决方案。但贪心不是从整体最优来考虑的,一旦做出选择,不会再改变 ,只能达到某种意义上的局部最优。
简记为:想要当下最好的,但会导致目光短浅

2. 贪心本质

应用情景 :当出现两个特性------贪心选择性质最优子结构性质时可用。
(1)贪心选择性质 :指原问题的整体最优解可以通过一系列局部最优的选择得到。运用同一规则,原问题可拆分为一个个相似的子问题,而后的每一步都是当前最优的选择。但其依赖于当前已做出的选择,无回溯过程。

(2)最优子结构性质 :指一个问题的最优解包含其子问题的最优解。如:原问题:S={a1,a2,a3,ai...an},转化为子问题:{ai},S-{ai}。即通过贪心选择当前最优解{ai}后,转化为求解子问题S-{ai}
求解步骤:

(1)贪心策略 :选择当前看上去最好的一个。如:最红的苹果是最好的,则每一次都选择最红的

(2)局部最优解 :每一次取到的结果记为ak(k=1,2,3...)

(3)全局最优解:把所有局部最优解整合为一个最优解{a1,a2,...}

3. 最优装载问题

有一天,海盗们截获了一艘装满各种各样古董的货船,每件古董都价值连城,一旦打碎就失去了价值。虽然海盗船足够大,但载重为c,每件古董的重量为wi,海盗们绞尽脑汁要把尽可能多的宝贝装上海盗船,该怎么办呢?
假设c为30,8件古董,价值分别为4,10,7,11,3,5,14,2

(1)问题分析

尽可能多:排序,每次选最小的装入

(2)算法实现

可以用一维数组w[]存储古董的数量

(1)借助c++中的排序函数sort

(头文件#include<algorithm>

排序算法如下:

cpp 复制代码
sort(begin,end)//参数begin和end表示一个范围,分别为待排序数组的首地址和尾地址,默认为升序

(2)代码如下:

cpp 复制代码
double tmp=0.0;//tmp为已装载到船上的古董的重量
int ans=0;//ans为已装载的古董个数
for(int i=0;i<n;i++)
{
	twp+=w[i];
	if(tmp<=c)
		ans++;
	else
		break;
}
cout<<ans<<endl;

(3)算法分析

(1)时间复杂度:

①sort函数,平均时间复杂度为O(nlogn);

②输入和贪心策略求解的两个for循环均为O(n);

故,总的为O(nlogn)
(2)空间复杂度:在程序中使用了tmp、ans等辅助变量,为O(1)

相关推荐
超级码力6661 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑2 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind2 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师3 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
Yzzz-F5 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业5 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn6 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室6 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星6 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿7 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算