关于贪心算法的心得体会

本文分享了作者在LeetCode上刷题后对贪心算法的理解与应用,通过具体实例如钱币找零与跳跃游戏,解析了如何确定问题是否适合采用贪心策略,并提供了源代码。

导语

本人一向对数字处理一类的算法知识点不够敏感,于是痛定思痛,从leetcode上面刷了一段时间之后,写这篇博客来记录和分享自己的体会。

贪心算法

顾名思义,就是用贪心算法解决题目时,只考虑局部最优解,换言之,要用贪心算法解题,就要保证该问题的整体最优解可化分为一个个局部最优解,(这也是最难的一点)

分析题目是否可用贪心算法

较为简单一类的贪心就是像1.分发饼干,2.硬币找零
等问题,能较为直接的看出每一步。
例)钱币找零问题
假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?
用直觉就能分析出要使纸币最少,就先用大面值来支付。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=7; 
int Count[N]={3,0,2,1,0,3,5};
int Value[N]={1,2,5,10,20,50,100};
  
int solve(int money) 
{
	int num=0;
	for(int i=N-1;i>=0;i--) 
	{
		int c=min(money/Value[i],Count[i]);
		money=money-c*Value[i];
		num+=c;
	}
	if(money>0) num=-1;
	return num;
}
 
int main() 
{
	int money;
	cin>>money;
	int res=solve(money);
	if(res!=-1) cout<<res<<endl;
	else cout<<"NO"<<endl;
}

例2) 跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 13 步到达最后一个位置。

分析
这题有两种解法,一种是暴力法,即从a[0]依次用递归开始找到最后,但这样容易超时,不推荐使用。
第二种就是,我们可以用贪心,想到从末尾开始,依次判断从当前点能否到达终点,代码如下

#include<bits/stdc++.h>
using namespace std;
 int a[100];
 int main(){
 	 int n;
 	  cin>>n;
 	  for(int i=0;i<n;i++){
 	  	 cin>>a[i];
	   }
	   for(int i=n-1;i>=0;i--){
	   	if(i+a[i]>=n)
	   	   n=i;//该点能到终点,从该点继续判断 
	   }
	   cout<<n==0 ? 1 :0;
 	return 0;
 }

以上就是最近的总结体会,欢迎指正

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值