贪心算法(又叫贪婪算法)Greedy Algorithm
admin
2024-03-03 15:35:18
0

本篇主要是介绍贪心算法:所谓贪心算法是用计算机来模拟一个“贪心”的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑以后可能造成的影响


文章目录

  • 一、贪心算法的思想

  • 二、贪心算法的过程

  • 三、关于贪心算法的一些基本模型


一、贪心算法的思想

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

贪心选择是所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素。

当一个问题的最优解包含其子问题的最优解时,称此问题提具有最优子结构性质,运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。贪心算法的每一次操作都对结果产生影响。贪心算法的每一次操作都对结果产生直接影响,贪心算法对每个子问体的解决方案都做出选择,不能回退。

贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。

二、贪心算法的过程

1.将求解的问题分为若干个子问题;

2.将每一子问体求解,得到子问题的局部最优解;

3.将子问题的局部最优解合成原来解问题的一个解;


三、关于贪心算法的一些基本模型

1.分割平衡字符串OJ链接

class Solution {
public:int balancedStringSplit(string s) {//贪心策略:只需要将问题分为若干个子问题,//每个子问题中只要达到了平衡就分割//如果出先R字符那么将平衡左移,如果出现了L字符那么平衡将进行右移,如果平衡一旦达到平衡就进行分割int count=0;//统计分割的次数int balance=0;//达到平衡的标志for(auto ch:s){if(ch=='R')--balance;else++balance;if(balance==0)count++;}return count;}
};

2.买卖股票的最佳时机IIOJ链接

class Solution {
public:int maxProfit(vector& prices) {//贪心策略:如果想要获得最大利润,可以每天购买或者出售股票使得每一天的利润最大化int profit=0;for(int i=1;iprices[i-1])profit+=prices[i]-prices[i-1];}return profit;}
};

3.跳跃游戏OJ链接

贪心算法:

class Solution {
public:bool canJump(vector& nums) {//贪心策略:从每一个元素开始如果该位置最远位置可以达到的话则将该位置上的数组与最远位置上的//数进行比较更新最大位置int MaxDistance=0;int pos=nums.size()-1;for(int i=0;i=i)MaxDistance=max(MaxDistance,nums[i]+i);elsereturn false;if(MaxDistance>=pos)return true;}return true;}
};

动态规划:

class Solution {
public:bool canJump(vector& nums) {//子状态:每个元素能够到达的最大位置//状态间的转移方程;F(i)=max(F(i-1),i+nums[i]);//初始化:F(0)=nums[0];//返回结果:vector dp(nums.size(),0);dp[0]=nums[0];if(nums.size()==1)return true;if(dp[0]==0)return false;for(int i=1;i
class Solution {
public:bool canJump(vector& nums) {vector F(nums.size());F[0]=true;if(nums.size()==1)return true;for(int i=0;i

class Solution {
public:bool canJump(vector& nums) {//子状态:从数组中第i个能否到达最后一个下标//状态间的转移方程:j=i+1;j F(nums.size());F[0]=true;if(nums.size()==1)return true;for(int i=0;i

4.钱币找零

/*
#include
#include
#include
using namespace std;
struct cmp
{bool operator()(vectorarry1, vectorarry2){return arry1[0] > arry2[0];}
};
int MaxNum(vector>& MoneyCut, int& money)
{//贪心策略:每一次都是使用最大面值的进行。int count = 0;//根据面值进行递减排序sort(MoneyCut.begin(), MoneyCut.end(), cmp());for (auto arr : MoneyCut){//0表示面值 1表示个数int c = money / arr[0];c = min(c, arr[1]);money -= c * arr[0];count += c;if (money == 0)return count;}if (money != 0)return -1;return count;
}
int main()
{vector < vector> moneycut = { {1,3},{2,1},{5,4},{10,3},{20,0},{50,1},{100,10} };int money = 0;cin >> money;cout << MaxNum(moneycut, money);
}
*/
#include
#include
#include
using namespace std;struct cmp
{bool operator ()(pair& p1, pair& p2){return p1.first > p2.first;}
};
template
int MaxNum(vector>& MoneyCut, int money)
{int count = 0;sort(MoneyCut.begin(), MoneyCut.end(), cmp());for (auto arr : MoneyCut){K c = money / arr.first;c = min(arr.second, c);money -= c * arr.first;count += c;if (money == 0)return count;}if (money != 0)return -1;return count;
}
int main()
{vector> moneycut = { {1,3},{2,13},{5,4 }, {10,3}, {20,0}, {50,1},{100,10} };int money = 0;cin >> money;cout << MaxNum(moneycut, money);
}

5.活动选择

/*#include
#include
#include
using namespace std;
//贪心策略:每次选择结束时间最早的活动
struct cmp
{bool operator()(vector&v1, vector&v2){return v1[1]>& events)
{int num = 1;int i = 0;sort(events.begin(), events.end(), cmp());for (int j = 1; j < events.size(); j++){//按照截止时间的顺序if (events[j][0] >= events[i][1]){num++;i = j;}}return num;
}int main()
{vector> events = { {1,4},{3,5},{0,6},{5,7},{3,8},{3,8},{5,9},{6,10},{8,11},{8,12},{2,13},{12,14} };cout << getMaxNum(events);
}
*/
#include
#include
#include
using namespace std;
struct cmp
{bool operator()(pair& p1, pair& p2){return p1.second < p2.second;}
};
template
int getMaxNum(vector>& events)
{sort(events.begin(), events.end(), cmp());int num = 1;int i = 0;for (int j = 1; j < events.size(); j++){if (events[j].first >= events[i].second){num++;i = j;}}return num;
}
int main()
{vector> events = { {1,4},{3,5},{0,6},{5,7},{3,8},{5,9},{6,10},{8,11},{8,12},{2,13},{12,14} };cout << getMaxNum(events);
}

6.无重叠区间OJ链接

第一种方式:

struct cmp
{bool operator()(vector&v1,vector&v2){return v1[1]>& intervals) {int num=1;int i=0;sort(intervals.begin(),intervals.end(),cmp());for(int j=1;j=intervals[i][1]){num++;i=j;}}return intervals.size()-num;}
};

 第二种方式:

struct cmp
{bool operator()(vector&v1,vector&v2){return v1[1]>& intervals) {int num=0;int i=0;sort(intervals.begin(),intervals.end(),cmp());for(int j=1;j=intervals[i][1]){i=j;}else{if(intervals[j][1]

相关内容

热门资讯

“我真的撑不住了”,2000万... 5月14日、15日两天,知名搞笑博主“大连老湿王博文”,分别在微信公众号和小红书上发表长文,宣布断更...
原创 9... 邱 林 没有想到的是,日本对中东地区石油依赖度竟高达96%,其中,阿联酋占43%,沙特阿拉伯占39%...
华金策略:A股短期可能难大调整... 来源:市场资讯 来源:华金证券 投资要点 复盘历史,驱动TMT行情结束的核心因素是外部事件和政策偏空...
5月18日突然大跌,金价行情拐... 刚刷完5月18日凌晨的金价数据,伦敦金现直接暴跌113.8美元,报4537.83美元/盎司,单日跌幅...
深化资本与产业协同 打造AI智... 央广网北京5月18日消息(记者 郭彦伟)“这款熊猫医生AI机器人主要能帮助大家实现生命体征检测、AI...
实地调研深圳融资市场 细数贷款... 在当下经济发展节奏较快的深圳,各行各业的资金周转需求愈发普遍,从个体日常大额支出、家庭置业规划,到个...
上市公司交出近三年最好成绩单 ... 上市公司是经济高质量发展的重要微观基础,稳中向好的成绩单有力印证中国经济的强大韧性与活力。从上市公司...
接连吃罚单!这家券商债券业务“... 5月15日,国都证券及其债券从业人员收到了北京证监局发出的5份行政处罚。 罚单显示,因在公司债券承销...
原创 美... 特朗普本次的中国之行,其深远影响将直接牵动美国今年中期选举的最终走向,因此,他此番远渡重洋,无疑是怀...
AI高景气与盈利持续兑现 机构... 存储芯片指数日K线图   范雨露 制图 上周,全球主要股指普遍回调,A股市场同样冲高回落,创业板指创...
2026天津房交会暨“新房市集... 近日,2026天津房交会暨“新房市集”活动在津一·PARK正式启幕。此次房交会由天津市房地产市场服务...
原创 【... 各位朋友,最近是不是感觉金店门口的“今日金价”牌子,数字变得有点“刺眼”?没错,黄金它……真的跌了,...
原创 推... 俄罗斯财长安东·西卢安诺夫接受自家媒体采访,透露了两条重磅消息。 第一个:中俄双边贸易中,本币结算率...
兆易创新盘中涨停续创历史新高 ... 5月18日早盘,兆易创新盘中涨停,股价续创历史新高,报412.87元/股,成交金额超130亿元,A+...
原创 价... 过去三年价格战硝烟弥漫,汽车价格一降再降。 然而曾经杀得眼红的车企们,如今集体踩下刹车,汽车售价不降...
4月居民贷款大幅缩水近8000... 一边是楼市延续修复态势,“小阳春”行情持续演绎,重点城市二手房成交量大幅攀升;另一边是居民信贷数据的...
金价暴涨里的“套保”迷影,山东... 山东黄金冶炼业务。图源:企业官网 本报(chinatimes.net.cn)记者张蓓 黄指南 深圳报...
扬帆出海获佳绩!盐田区携手黄金... 2026年5月8日至10日 在马来西亚槟城举办的 “2026马来西亚黄金珠宝展销会”上 深圳市盐田区...
政策底与情绪顶:5月18日-2... 文/金透社 万捷 2026年5月第三周(5月11日-15日),A股市场走出了鲜明的分化格局。上证指数...
证监会重罚欺诈发行,广发证券被... 4.63亿元。 这是2026年5月,证监会对清越科技、元道通信两家公司欺诈发行、财务造假的罚款总额。...