贪心算法及其经典例题

76. 最小覆盖子串 滑动窗口 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保证它是唯一的答案。 示例 1: 输入:s = “ADOBECODEBANC”, t = “ABC” 输出:“BANC” 示例 2: 输入:s = “a”, t = “a” 输出:“a” 示例 3: 输入: s = “a”, t = “ 阅读详情

引言:

贪心算法是经典算法之一,也叫贪婪算法或启发式算法,它对整个求解过程的局部做最优调整,它只适用于求较优解或者部分解,而不能求最优解。这样的调整方法叫贪心策略,至于什么问题需要什么样的贪心策略是不确定的,具体问题具体分析。例如求最小生成树的Prim算法和Kruskal算法都是漂亮的贪心算法。

贪心算法适用的问题:

背包问题、带有期限的作业排序,最小生成树、单源点最短路径

适用贪心算法的场景:

简单地说,问题能够分解成子问题来解决,子问题的最优解能够递推到最终问题的最优解。这种子问题最优解成为最优子结构。

贪心算法和动态规划算法的不同

贪心算法与动态规划算法的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。

贪心算法的正确性:

要想证明贪心算法的正确性,那么就要证明出贪心解就等于最优解。大多数很容易证明出贪心解等于最优解。证明贪心解等于最优解的方法有:数学归纳法、反证法等等。

问题描述:

有一类问题,它有n个输入,而它的解就是这n个解的某个子集,这些子集必须满足某些先给定的条件。贪心方法是指在对问题求解时,总是做出在当前看来是最好的选择。通过选择局部最优已到达或接近全局最优。

贪心算法的相关题目:

题目1:合并果子

题目链接
题目描述:
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n-1n−1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 11 ,并且已知果子的种类 数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有 33 种果子,数目依次为 11 , 22 , 99 。可以先将 11 、 22 堆合并,新堆数目为 33 ,耗费体力为 33 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 1212 ,耗费体力为 1212 。所以多多总共耗费体力 =3+12=15=3+12=15 。可以证明 1515 为最小的体力耗费值。

输入输出示例:
在这里插入图片描述

题解:

这道题很明显就可以使用贪心算法求解。每次选择两个最小的果子堆进行合并,从而达到消耗的体力最小。如果选择较大的果子堆进行合并,则合并后的果子堆更大,对于以后的合并产生不利会逐渐增加。所以肯定不会是最优解。

代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	int n;
	cin>>n;
	vector<int> ve(n);
	int i;
	for(i=0;i<n;i++)
	cin>>ve[i];
    int sum=0;
    sort(ve.begin(),ve.end()); 
    for(i=0;i<n-1;i++)
    {
        ve[i+1]+=ve[i];//找到前面两个最小的
        sum+=ve[i+1];
        int j=i+2,temp=ve[i+1];
        while(j<n&&temp>ve[j])//把合并后的值插入,使序列递增
		{
			ve[j-1]=ve[j];
			j++;
		}
        ve[j-1]=temp;
    }
	cout<<sum<<endl;
	return 0;
}

题目2:部分背包问题

题目链接
题目描述:

在这里插入图片描述
输入输出:
在这里插入图片描述

题解:

因为金币可以任意分割,那么要想拿走价值最大的金币,就要去单位重量价值最大的金币。所以我们只需对单位重量价值最大的金币进行排序,直到取出的金币装满整个背包。

代码:

#include<iostream>
#include<algorithm>
#include<vector>
#include<iomanip>
using namespace std;
struct coin
{
	int wealth;
	int weight;
	double avg;
};
bool cmp(coin a,coin b)
{
	return a.avg>b.avg;
}
int main()
{
	vector<coin> ve;
	int a,b,i,n,sum;
	cin>>n>>sum;
	for(i=0;i<n;i++)
	{
		cin>>b>>a;
		coin s;
		s.wealth=a;
		s.weight=b;
		s.avg=a*1.0/b;
		ve.push_back(s);
	}
	sort(ve.begin(),ve.end(),cmp);
	double money=0;
	for(i=0;i<ve.size();i++)
	{
		if(sum>=ve[i].weight)
		{
			money+=ve[i].wealth;
			sum-=ve[i].weight;
		}
		else
		{
			money+=ve[i].avg*sum;
			break;
		}
	}
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<money<<endl;
	return 0;
}

题目3:买卖股票的最佳时期

题目链接
题目描述:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
输入输出:
在这里插入图片描述

题解:

要想取得最大的效益,那么如果明天的股票更贵,那么今天就买,如果明天的股票便宜,那么今天就卖,由此可以得到最大效益。

代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size()==0)
        {
            return 0;
        }
        int i,j;
        int sum=0;
        
        for(i=0;i<prices.size()-1;i++)
        {
            if(prices[i+1]>prices[i])
            {
                j=i+1;
                while(j+1<prices.size()&&prices[j+1]>prices[j])
                {
                    j++;
                }
                sum+=prices[j]-prices[i];
                i=j;
            }
        }
        return sum;
    }
};
【算法】基础算法中的十大经典问题(视频笔记) /** * 分治算法:汉诺塔 */ public class Hannoitower { public static void main(String[] args) { hannoitower(3,'A','B','C'); } /** * 递归汉诺塔 * @param num 盘得个数 * @param a 代表 a塔 * @param b 代表 b塔 * @param c 代表 c塔 */ 阅读详情

相关推荐

贪心算法三个经典例题

贪心算法的三个经典例题 A- Saruman’s Army 题目描述:Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as pal...

贪心算法 6419

贪心算法例题

贪心算法经典例题解析 贪心法:遵循某种规律,不断贪心的选取当前最优策略的算法设计方法。 例一:分糖果 已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s >= 某个孩子的需求因子g时,代表该糖果可以满足该孩子;求使用这些糖果,最多能满足多少孩子?(注意,某个孩子最多只能用1个糖果满足)例如,需求因子数组g = [5, 10, 2, 9, 15, 9];糖果大小数组s = [6, 1, 20, 3, 8];最多可以满足3个孩子 思考:   1、当某个孩子可以被多个糖果

xiaobaidad的博客 3669

【算法】递归算法及其经典例题

【算法】递归算法及其经典例题

duxingpeng的博客 1066

算法提高:贪心策略的11个经典题目

算法成神之路:11个经典贪心算法

阿呆的隐秘角落 8549

贪心算法经典例题.doc

贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc

SAP采购订单中项目类别B(限制)的控制逻辑

在笔者所在企业中,框架类采购订单中项目类别需要选择B(限制)。今天笔者从比较全面的角度分析了一下这个项目类别B到底可以决定些什么?控制到什么?先从后台SPRO中打开相应的配置菜单。 打开项目类别B之后,可以看到一些配置信息,这里有一点与其它配置不同的地方,即无法新增项目,也无法修改现有项目。这个疑惑今后再去解决吧。当前只研究项目类别B的控制逻辑。 下面就参考上图中的配置分段来分析和测试其控制逻辑, 1、如项目类别配置图,所需材料值为不允许;经测试,如下图在采购订单创建时,不能输入物料编号条目。

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6034

【贪心思想】兄弟总爱贪小便宜,原来是把贪心算法掌握得如此熟练【经典例题讲解】

⭐️引言⭐️ 大家好,我是执梗。最近通过我这篇蓝桥全解析文章——蓝桥全解析【内附资源】来找我咨询的兄弟很多。他们都有一个问题——贪心是不是最难的算法呀?答案确实是肯定的,那有的兄弟们就觉得那我是不是要把其他的算法都学熟练以后再来学习贪心呢?这个答案却是否定的。贪心确实是没有套路可言,与其说它是算法,更不如说贪心更像是一种思想。正所谓人不为己天诛地灭,人有贪嗔痴三念,贪心这件事上每个人都是有天赋的,所以我们从开始学习算法就要训练一种贪心的思想。给个小剧场让大家代入一下 ⭐️小剧...

执梗的博客 1675

RK3566基于Buildroot定制QT开发环境的完整指南

本文详细介绍了如何在RK3566开发板上使用Buildroot定制QT开发环境的完整流程。从基础环境搭建、Buildroot初始配置到QT模块选择与编译验证,提供了实战经验和常见问题解决方案,帮助开发者高效完成嵌入式Linux下的QT开发环境部署。

weixin_26804345的博客 360

贪心算法(附贪心相关习题)

相关题目: 1.Stripies 2.Protecting the Flowers

li_wen_zhuo的博客 957

Hive SQL零基础到精通:100道练习题+答案,SQL能力快速提升

我将以我15年架构与开发的经验,带领大家从零基础到精通,通过精心设计的100道练习题及其详解,系统地、深度地掌握Hive SQL的核心精髓。它可以将结构化的数据文件映射为一张数据库表,并提供了一套类SQL的查询语言——HiveQL(简称HQL),允许熟悉SQL的用户直接查询存储在HDFS上的海量数据。它将Job描绘为DAG(有向无环图),允许更灵活的任务编排,避免不必要的中间落盘,可以复用容器,从而大幅降低延迟。希望你以此文为起点,在广阔的大数据世界里继续遨游,成为一名真正的数据高手!

架构师的AI之路,分享AI应用开发架构的学习与实践。 799

手把手教你用PLECS仿真BUCK数字电源(含DSP代码实现)

本文详细介绍了如何利用PLECS仿真软件与Visual Studio 2022搭建高保真数字电源开发环境,手把手指导从BUCK电路建模、编写硬件感知的C控制算法到参数调优的全过程。重点阐述了通过DLL接口实现软件在环仿真,模拟DSP的ADC/PWM时序,并将验证后的代码无缝迁移至TI C2000系列DSP,构建从仿真到固件的完整数字电源开发闭环,显著提升开发效率与一次成功率。

oo7890的博客 399

贪心算法总结(自用)

贪心的基本 贪心算法是指,在对问题求解时,总是以当前情况为基础作最优选择,而不考虑各种可能的整体情况,它所做出的仅仅是在某种意义上的局部最优解,省去了为找最优解要穷尽所有可能而必须耗费的大量时间,类似数学归纳法,无后效性,在运行过程中没有回溯过程,每一步都是当前的最佳选择。 而BFS则与之不同,它是将所有的可能路线能全部列举出来,并结合其相关限定条件选取想要的解,可能它路线里面并没有关于下一步的局部最优解,但它所得到的解即为全局的最优解。 文章目录贪心的基本前言一、相关例题总结二、例题1.背包问题:2.哈

cloud_sea0724的博客 276

STM8开发环境搭建(STVD + COSMIC)

一、STM8开发IDE 1. STVD + COSMIC ST Visual Develop (STVD)只支持汇编开发,C语言开发需要再安装COSMIC,配套起来使用。 2. IAR IAR也可以用来开发STM8 下面介绍STVD + COSMIC的搭建方式 二、环境搭建 1. STVD下载、安装 直接从官网下载:https://www.st.com/en/development-tools/stvd-stm8.html 安装很简单,基本下一步往下点。 2. COSMIC下载、安装 对于stm8可以使用3

a183635870的博客 1万+

贪心算法常见题目类型

本文系统介绍了贪心算法及其常见应用。首先阐述了贪心算法的基本性质(贪心选择性和最优子结构)和解题步骤。然后详细讲解了6类典型问题:1)可分割背包问题;2)Dijkstra单源最短路径算法;3)哈夫曼编码;4)最小生成树(Prim和Kruskal算法);5)多机调度问题;6)其他例题(数字删除最大值、独木舟问题、果子合并)。针对每类问题,文章都给出了问题描述、算法思想和具体解题步骤,并通过示例说明实现过程。最后指出贪心算法虽不能保证所有问题的最优解,但在满足贪心性质的问题中具有高效优势。

hdhdhshbe的博客 634

用数据分析优化彩票决策:放弃预测,专注理性投入

彩票本质上是负和博弈的概率系统,其核心并非号码预测,而是对玩法规则、返奖率(RTP)、投入策略与心理约束的量化决策。基于组合数学与二项分布的分析方法,可精确计算各奖项概率、评估不同玩法的实际回报效率,并构建个人资金-风险-目标模型。数据的价值不在于打破随机性,而在于识别非随机环节——如奖池跃升期的RTP波动、固定奖的保底收益、冷热号背后的分奖博弈结构。这种以决策优化为导向的数据实践,适用于将彩票视为受控实验的理性参与者,而非追求玄学中奖的投机者。

frank1998819 644

FPGA进位链(Carry Chain)实战:从Xilinx CARRY8原语到性能优化全解析

本文深入解析了FPGA进位链(Carry Chain)的原理与应用,重点剖析了Xilinx CARRY8原语的端口功能与内部机制。通过实测数据揭示了进位链的真实延迟特性与温度影响,并详细阐述了如何利用DI和S信号进行动态路径优化、实现减法运算与条件进位选择,从而有效提升设计性能。最后,文章探讨了系统级的流水线拆分、布局约束等实战优化策略与常见陷阱。

weixin_29313817的博客 453

贪心算法:每一次都选最好,真的能全局最优吗?

给出一个正整数 n,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 再加 1,否则除以 2。经过若干次循环后,最终都会回到 1。经过验证很大的数字(7×10。)都可以按照这样的方式比变成 1,所以被称为“冰雹猜想”。例如当 n 是 20,变化的过程是 20→10→5→16→8→4→2→1。根据给定的数字,验证这个猜想,并从最后的 1 开始,倒序输出整个变化序列。输出若干个由空格隔开的正整数,表示从最后的 1 开始倒序的变化数列。数据保证,1≤n≤100。输入一个正整数 n。

m0_74161592的博客 360

广州吉欧电子科技有限公司安卓开发工程师岗位 - 技术核心、职责详解与面试指南

广州吉欧电子科技有限公司招聘安卓开发工程师,该岗位可接收优秀应届生。岗位职责包括:1)负责安卓应用架构设计与开发,确保稳定性和可扩展性;2)功能模块编码实现与测试;3)性能优化与用户体验提升;4)后端接口对接;5)系统版本适配;6)用户反馈处理迭代;7)特殊要求熟悉RTK高精度定位技术原理及使用。该岗位要求扎实的安卓开发技术、良好的架构设计能力、性能优化经验,以及特定领域的RTK专业知识,是一个技术全面且具有专业特色的开发岗位。

郑伟强dev的专栏 154

贪心算法的几种经典例题

什么是贪心算法 贪心算法是一种在解决问题的过程中追求局部最优的算法,对于一个有多种属性的事物来说,贪心算法会优先满足某种条件,追求局部最优的同时希望达到整体最优的效果。以背包问题为例,可以放在背包中的物体有它的重量和价值两种属性,背包的容量也是有限的,我们希望得到一种价值最大的物品摆放方式,如果我们倾向于重量贪心,那么在摆放物品的时候会优先放重量小的,但这和我们追求的价值最优没有关系,自然不能采用...

马一凡的博客 5万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

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

[算法系列]贪心算法策略介绍+10道经典例题解析

本部分介绍“贪心算法“ 。 接下来会介绍动态规划。回顾一下之前脉络: 什么是递归?如何设计递归算法? || \/ 常见的递归算法应用(快排、归并、堆、) || \/ 深入递归本质:数学归纳,递推 || \/ 深度遍历优先搜索(DFS)、回溯、剪枝 || \/ 贪心算法、动态规划 那么贪心、动规与前面这些有什么联系呢?为什么要放在这里介绍? 首先,贪心、动规和dfs这样的搜素算法实际很相似,是为了搜索解空间获得(满足条件)的解。DFS是按照一定的(深度优

lawfree的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

贪心算法(附蓝桥杯例题)

贪心算法(Greedy Algorithm)是一种‌通过局部最优选择逐步推导全局最优解‌的算法思想‌4。‌无后效性‌:当前决策不影响后续状态‌最优子结构‌:局部最优解能推导全局最优解适用于贪心算法的问题往往具有明确的‌排序性质‌和‌可分解性‌,如合并问题、区间调度等‌45。

m0_74655006的博客 1483

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

详解贪心算法(Python实现贪心算法典型例题)

贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 贪心算法的要素 贪心选择 贪心选择是指所求问题的整体最优解可以通过...

一个平平无奇的甜妹 4万+

贪心算法典型例题

贪心是算法中一种特别基础和重要的思想,下面从几个例题中开始讲解贪心的思想。 1. 分糖果(leetcode455) 题目:已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s&amp;amp;amp;gt;=某个孩子的需求因子g时,代表该糖果可以满足该孩子,求使用这些糖果,最多能满足多少孩子(注意,某个孩子最多只能用1个糖果满足) 思考: 当某个孩子可以被多个糖果满足时,是否需要...

bajin7353的博客 3万+

【刷题日记】贪心算法经典题目

????大家好,我是白晨,一个不是很能熬夜????,但是也想日更的人✈。如果喜欢这篇文章,点个赞????,关注一下????白晨吧!你的支持就是我最大的动力!???????????? 文章目录????前言????贪心算法经典题目????1.分割平衡字符串????2.买卖股票的最佳时机????3.跳跃游戏????4.多机调度问题????5.活动选择????6.最多可以参加的会议数目????7.无重叠区间????总结 ????前言 观前提示:此文章需要一定贪心算法的基础。 大家好呀,我是白晨????。 贪心算

白晨的博客 5223

贪心算法及几个经典例子

贪心算法 一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状...

weixin_34128501的博客 6958

贪心算法基本概念and经典例题(Python代码实现)

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子问题性质,也称此问题满足最优性原理。

2301_80188585的博客 1365
上一篇: 动态规划及其动态规划经典例题
下一篇: 分治法及经典例题
追梦少年ML
博客等级 码龄7年 36粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值