贪心算法

【算法】—贪心算法详解 !翻硬币快乐司机旅行家的预算买卖股票的最好时机I买卖股票的最好时机IIPrim算法_优快云博客_prim算法dijstra求最短路径最小花费。 阅读详情

贪心算法简要介绍:https://oi-wiki.org/basic/greedy/

1.贪心算法基本原理

1)描述

        贪心算法(又称贪婪算法)是指:在对问题求解时,总是做出在当前看来是最好的选择。也就是说不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。(不关注整体只关注局部)

(正确的废话,但是没用)

        贪心算法的关键:贪心策略的选择。

2)适用情况

        贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。

(1)适用情况

        假设只能拿一张,肯定是拿最大的,所以可以把问题拆解成那三次一张的纸币获得的最大值

(2)不适用情况

        你有一个承重为8的背包,在不超过背包承重上限的情况下,你能获得的物品最大总价值是多少?(01背包问题)

        贪心算法:考虑局部最优,先选择价值最大的,即选择物品一,此时背包最多可以装重量为2的物品,所以结果是9,显然不对。

通过以上两个例子不能说贪心算法只能解决比较的简单问题。

由于贪心算法的算法框架中没有套路,因此在设计贪心算法时可用的思维抓手比较少,导致设计贪心算法时,依靠灵感。(比较需要天赋)

3)贪心算法证明

     

4)贪心与偏序关系

(1)偏序关系

符合贪心算法思想。

(2)形式定义

传递性,通常情况下,在贪心算法设计中解释了为什么贪心算法局部最优,最终保证局部最优。

(3)联系

        在贪心算法设计中,主要寻找偏序关系,最后加以证明,那么贪心算法就设计出来了。        

        eg:HZOJ-256国王游戏---https://oj.haizeix.com/problem/256

 

假设排为以下顺序:(调换i与i+1位置的大臣)

如果第二个序列优于第一个序列,则乘积越大的越往前排,它不会使得我所得到的方案变差。(偏序关系在贪心算法中的体现)

5)学习心法

        在一次又一次的贪心策略证明中掌握:贪心策略的选择。

2.练习题

1)HZOJ-505最大整数

--https://oj.haizeix.com/problem/505

        局部:A+B>B+A,则A排在B前面

        整体:按照如上策略得到的排序以后的序列就是最大整数。

        代码如下所示:

#include<bits/stdc++.h>
using namespace std;
bool cmp(const string &a,const string &b){
	return a+b>b+a;
}
int main(){
    int n;
    vector<string> arr;//字符串数组
    string s;
    cin>>n;
    for(int i=0;i<n;i++){
		cin>>s;
		arr.push_back(s);
	}
	sort(arr.begin(),arr.end(),cmp);
	for(int i=0;i<n;i++){
		cout<<arr[i];
	}
	cout<<endl;
    return 0;
}

贪心策略证明(之后的题不再做证明):

        证明1:A+B>B+A(+字符串的连接),为什么?

         情况1:A>B(基于字典序--按位进行比较)

                        eg:123,96        数字中123>96   字典序:96>123,按位比较9>1,因此96>123

                  不用证明,这是显而易见的。

          情况2:A<B且A不是B的前缀

                这种情况是不可能的。

        情况3:A是B的前缀

                         那么黄色部分全相等。

        如果A+B>B+A,则红色部分的字符<绿色部分的字符。

证明2:当A+B>B+A,为什么A排到B前面,能保证全局最优。

        假设:排序以后为:A、C、B

        反证法:假设,最优策略不是A、C、B,而是B、C、A;

 

两种字符串:

因为排序以后为:A、C、B所以红色部分字典序小于绿色部分,因此BCA一定小于ACB,所以当A排在B前面总是优于B排在A前面。

2)HZOJ-504-删数

--https://oj.haizeix.com/problem/504 

        局部:每次删除一个离最高位最近的逆序位的第一个数字1234321,其中43是离最高位最近的逆序位,删除4即可。

        整体:按照如上策略执行n次以后,得到的就是最小的整数。

代码如下所示:

#include<bits/stdc++.h>
using namespace std;
bool cmp(const char &a,const char &b){
	return a<b;
}
int main(){
    int n;
    char s[505];
    cin>>s>>n;
    for(int i=0;i<n;i++){
		int j=0;
		while(s[j+1]!='\0'&&s[j]<=s[j+1])j++;
		while(s[j])s[j]=s[j+1],j++;
	}
	for(int i=0,flag=1;s[i];i++){
		if(s[i]=='0'&&flag)continue;
		cout<<s[i];
		flag=0;
	}
	cout<<endl;
    return 0;
}

3)HZOJ-503-独木舟

--https://oj.haizeix.com/problem/503 

        局部: 每次安排,如果最重的人和最轻的人能坐一起,就坐一条独木舟,否则最重的人自己坐一条船。

        整体:按照如上策略执行,就能得到最少的独木舟。

代码如下所示:

#include<bits/stdc++.h>
using namespace std;
const int N=30010;
bool cmp(const char &a,const char &b){
	return a<b;
}
int a[N];
int main(){
    int w,n;
    cin>>w>>n;
    for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	int ans=0;
	for(int i=1,j=n;i<=j;){
		if(i!=j){
			if(a[i]+a[j]<=w)ans++,i++,j--;
			else ans++,j--;
		}else{
			ans++;
			break;
		}
	}
	cout<<ans<<endl;
    return 0;
}

4)HZOJ-258-最大子阵和

--https://oj.haizeix.com/problem/258

        局部:s代表以前一个位置为结尾的最大子序和,当前值为 a则s>=0,s+=a否则s=a。

        整体:按照如上策略执行,过程中s的最大值,就是最大子序和。

代码如下所示:

#include<bits/stdc++.h>
using namespace std;
const int N=110;
bool cmp(const char &a,const char &b){
	return a<b;
}
int a[N][N];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			a[i][j]+=a[i-1][j];//从1~i行第j列的和值
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){//起始行号
		for(int j=i;j<=n;j++){//终止行号
			int s=0;
			for(int k=1;k<=n;k++){
				int x=a[j][k]-a[i-1][k];//从i~j行第k列的和值
				if(s>=0)s+=x;
				else s=x;
				if(s>ans)ans=s;
			}
		}
	}
	cout<<ans<<endl;
    return 0;
}

5)HZOJ-511-最少操作次数

https://oj.haizeix.com/problem/511

        局部:ans代表最少操作次数,则ans更新策略如下:

                情况1:若 a * k <= b ,ans += 1 + b % k , b /= k; 

                情况2:若 a * k > b , ans += (b - a) , 终止;

        整体:按照如上策略执行,最终得到的ans,就是最少操作次数。

        补充(进制):将 a 和 b 看成一个 k 进制的数,a * k 就是将a的 k 进制形式向左平移一位,末尾加个 0。

        结论1:使用 * k 优于 + 1 操作(eg : a=3,b=10,k=3------a*k+1=10只需要两次,a+1*7=10,需要7次)

        结论2:当 a 为 b 的数字前缀时,再使用 * k 操作。

               eg : b ( k 进制形式 ):1 4 2 3

                      a ( k 进制形式 ):      1 2

                a -> b : +1 +1      * k +1 +1      * k +1 +1 +1

              对应:      [ b - a]    [ 1 + b % k]    [ 1 + b % k ]

代码如下所示:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve(){
    ll a,b,k;
    cin>>a>>b>>k;
    ll ans=0;
    if(k==0){
		if(b==0)cout<<(ll)min(a,(ll)1)<<endl;
		else cout<<(b-a)<<endl;
		return ;
	}
	if(k==1){
		cout<<(b-a)<<endl;
		return ;
	}
    while(1){
		if(a*k<=b)ans+=1+b%k,b/=k;
		else {
			ans+=(b-a);
			cout<<ans<<endl;
			return ;
		}
	}
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

算法讲解——贪心算法 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优(局部最优)的选择,从而希望导致全局最优解的算法策略。贪心算法的核心思想是“贪心选择”,即通过局部最优解逐步构建全局最优解。 阅读详情

相关推荐

循序渐进,搞懂什么是贪心算法

详解贪心算法

weixin_43790276的博客 3646

贪心算法(greedy algorithm,又称贪婪算法)详解(附例题)

贪心算法(Greedy Alogorithm)又叫登山算法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但是适用范围有限的策略。贪心算法没有固定的框架,算法设计的关键是贪婪策略的选择。.........

Kk的博客 10万+

MATLAB语言的贪心算法

贪心算法是一种简单且高效的算法设计思想,适用于特定类型的优化问题。通过MATLAB的实现,我们可以直观地理解贪心算法的思想和应用。尽管在某些情况下贪心算法可能无法得到全局最优解,但在许多实际问题中,贪心算法提供了有效且便于实现的解决方案。随着数据科学和机器学习的不断发展,贪心算法的应用前景将越来越广泛。深入理解和掌握贪心算法将为我们解决复杂的实际问题提供重要的工具和思维方式。希望本文能够为读者提供关于贪心算法的有效启示和参考。

2501_91314565的博客 1044

【贪心算法】贪心算法原理思想、算法步骤,应用示例(找零问题、活动选择问、霍夫曼编码、最小生成树问题、车辆路径问题)

贪心算法是一种基于贪心策略的优化算法,它在每一步选择中都采取当前状态下的最优决策,而不考虑未来的后果。通常,这种算法对于解决一些最优化问题非常有效,尤其是那些可以通过局部最优解来达到全局最优解的问题。

qq_35831906的博客 1万+

贪心算法介绍

贪心算法思想:顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。贪心算法

zhouq1986的专栏 8170

手把手教你用GEM-2多频电磁仪找地下管道(附真实数据图)

本文详细解析了使用GEM-2多频电磁仪精准定位地下管线的全流程,包括设备调试、频率选择、现场扫描技巧及数据解读。通过真实案例展示了如何应对复杂干扰环境,提升管线检测效率与准确性,特别适合市政工程和地下管线普查。

weixin_42565652的博客 404

【贪心算法】贪心算法

【贪心算法】贪心算法

fight_p的博客 1万+

5G 网络的移动性管理上下文对比介绍

5G 网络的移动性管理上下文对比介绍 4G/5G MM移动性管理机制对比 5G引入了新移动性管理状态,通过mobility pattern(移动方式)实现按需的移动性管理等。 MM的相关状态分为一下几种: RM状态(用户注册管理 注册态/非注册态)和CM状态(用户连接态/空闲态)独立;RM状态标识UE是否注册到网络,CM状态标识UE和核心网的信令连接是否存在。 RAN侧引入RRC-inactive state:UE(用户端)对于CN(核心网)而言处于连接态,对RAN(接入网)而言处于Ld..

m0_59032675的博客 4829

【贪心算法】一文让你学会“贪心”(贪心算法详解及经典案例)

贪心算法是一种非常常见的算法,它的简单和高效性使其在实际应用中被广泛使用。 贪心算法的核心思想是在每一步都采取当前状态下最优的选择,而不考虑未来可能产生的影响。虽然贪心算法不能保证总是得到最优解,但在很多情况下,它可以获得很好的结果。 本篇文章将介绍贪心算法的基本概念和一些经典应用,以及如何通过贪心算法来解决一些实际问题。希望通过本文的阅读,读者可以对贪心算法有更加深刻的理解,并能够在实际问题中应用贪心算法来得到更好的解决方案。 让我们暴打贪心算法吧!

m0_69383623的博客 5336

StarWind V2V Converter v9 虚拟磁盘转换工具使用教程 (转)

StarWind V2V Converter v9.0.1.268 是一款免费的虚拟磁盘转换工具,支持不同管理程序间的虚拟机镜像格式转换,包括VMDK、VHD/VHDX、IMG和QCOW2等格式。该工具具有窗口修复模式、零拷贝转换和管理程序切换等特色功能,能够轻松实现物理机到虚拟机的转换,并兼容主流管理程序如Hyper-V、ESXi等。使用教程详细介绍了从本地文件选择到格式转换的完整操作流程,转换过程简单高效且不影响原虚拟磁盘数据。

hsh的专栏 1484

打开UG会安装报错:initialization internal ERROR 的提示框,提示line 1344 of错误的解决方案

打开UG会安装报错:initialization internal ERROR 的提示框,提示line 1344 of错误的解决方案

Q82556499的博客 3524

详解贪心算法

贪心算法是一种在求解最优化问题时采取的一种常用算法策略。贪心算法的基本思想是,每次选择当前情况下的局部最优解,并相信这个局部最优解能够导致全局最优解。

闻道有先后,术业有专攻 4752

2、Elixir与Erlang:构建高可用系统的利器

本文介绍了Elixir与Erlang在构建高可用系统方面的优势,深入探讨了Erlang的并发机制、容错能力以及分布式特性,并结合实际应用场景展示了其在服务器端开发中的强大能力。此外,还提供了学习资源和交流平台,帮助开发者快速上手并深入实践。

grape的博客 125

关于贪心算法的研究

关于贪心算法的研究[摘要] 本文对贪心算法进行较详细的研究。第一部分明确其基本概念,第二部分介绍常见的贪心模型,第三部分给出常用的贪心证明方式,第四部分介绍贪心的经典算法,第五部分与其他算法进行比较,最后总结贪心算法的优劣性、竞赛应用及前景。 [关键词] 贪心算法、Prim、kruskal、Dijkstra、Huffman、拟阵、证明贪心算法是在信息学竞赛中一个常用的重要算法。在许多的经典算法中

It's Maverick. 1万+

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 462

SOME/IP协议详解「2.1.2·Payload数据类型序列化」

SOME/IP协议详解「2.1.2·Payload数据类型序列化」 点击返回雪云飞星的SOME/IP协议详解「总目录」 SOME/IP协议详解「2.1.2·Payload数据类型序列化」1 大小端问题2 数据对齐填充问题3 都有哪些数据类型 之前简单的概括了一下序列化/反序列化,就是降维打击,从这一章开始到2.1所有章节结束,都在讲解这个降维打击的详细规则与原理 1 大小端问题 首先什么是大小端: 大端:高字节存放到内存的低地址 小端:高字节存放到内存的高地址 假如有一个数据是0x12345678

雪云飞星的博客 4630

贪心算法介绍及应用(贪心算法)

贪心算法(Greedy Algorithm)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,它不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。贪心算法采用自顶向下、以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将问题简化为一个规模更小的子问题,通过每一步的局部最优选择,期望最终得到全局最优解。贪心算法是一种重要的算法设计策略,在解决许多实际问题中具有广泛的应用。它的核心在于选择合适的贪心策略,通过局部最优选择来逐步逼近全局最优解。

ZHANGKB_的博客 3230

JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

【代码】JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 471

贪心算法总结

一 基本思想     贪心算法总是作出在当前看来最好的选择。即贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择,不一定达到全局最优。     当一个问题动具有最优子结构性质时,可用动态规划算法求解,但有时贪心算法会更简单有效。如下图所示例题,贪心所得的局部最优就是全局最优。     贪心算法解题简单、有效,利用了问题本身的特性。但它有时并不能从局部的最优得到整体的最优。如下图所示例题,贪心所得的局部最优并非全局最优。     虽然贪心算法不是对所有问题都能从局部得到整体的最优解,但它

Summer_night_star的博客 5353

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

贪心算法综述

贪心算法综述引言贪心算法的基本概念贪心算法的定义贪心算法的选择性质贪心算法的流程贪心算法的实现过程贪心算法与动态规划贪心算法模型背包问题单源最短路径问题贪心算法的问题贪心算法的优缺点经典贪心算法普里姆算法普里姆算法概览算法简单描述Kruskal算法Kruskal算法概览算法简单描述Dijkstra算法Dijkstra算法思想Dijkstra算法步骤 引言 近年来的信息学竞赛中,经常需要求一个问题的可行解和最优解,这就是所谓的最优化 问题。贪心法是求解这类问题的一种常用算法。在众多的算法中,贪心法可以算的上是

bigplipli的博客 8298

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

贪心算法详解

​ 有人说贪心算法是最简单的算法,原因很简单:你我其实都很贪,根本不用学就知道怎么贪。有人说贪心算法是最复杂的算法,原因也很简单:这世上会贪的人太多了,那轮到你我的份? 贪心算法思想: 顾名思义,贪心算法总是作出在当前看来最好的选择。...

m0_54615144的博客 4270

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

一文详解贪心算法

《算法导论》有关贪心和相关例题的详细解析以及信息学奥赛C++的贪心问题

m0_74985290的博客 1664
上一篇: 约数之和,约数个数
下一篇: C++中字符串的相关函数及其使用
01star️
博客等级 码龄3年 96粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值