首页 > 编程语言 >C/C++贪心算法

C/C++贪心算法

时间:2024-10-13 18:46:34浏览次数:3  
标签:问题 C++ 选择 算法 最优 宝物 贪心

C++中的贪心算法

一、基本概念

贪心算法(又称贪婪算法,Greedy Algorithm)是指,在对问题求解时,总是做出在当前看来是最好的选择,不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题能产生整体最优解或者是整体最优解的近似解。它需要满足贪心选择性质和最优子结构性质:

  • 贪心选择性质:原问题的整体最优解可以通过一系列局部最优的选择得到。应用同一规则,将原问题变为一个相似的但规模更小的子问题,而后的每一步都是当前最佳的选择,这种选择依赖于已做出的选择,但不依赖于未做出的选择。
  • 最优子结构性质:问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。

二、证明方法

贪心算法有两种证明方法:

  • 反证法:如果交换方案中任意两个元素/相邻的两个元素后,答案不会变得更好,那么可以推定目前的解已经是最优解了。
  • 归纳法:先算得出边界情况(例如n = 1)的最优解F1,然后再证明:对于每个n,Fn+1都可以由Fn推导出结果。

三、常见题型及解法

(一)常见题型

在提高组难度以下的题目中,最常见的贪心有两种:

  • 我们将XXX按照某某顺序排序,然后按某种顺序(例如从小到大)选择。
  • 我们每次都取XXX中最大/小的东西,并更新XXX(有时「XXX中最大/小的东西」可以优化,比如用优先队列维护)。

(二)解法

  1. 排序解法
    • 适用情况:输入一个包含几个(一般一到两个)权值的数组。
    • 解法:通过排序然后遍历模拟计算的方法求出最优值。
  2. 后悔解法
    • 思路:无论当前的选项是否最优都接受,然后进行比较,如果选择之后不是最优了,则反悔,舍弃掉这个选项;否则,正式接受。如此往复1

四、与动态规划的区别

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

五、C++中的实例

  1. 找零钱问题
    • 策略:优先选用面值最大的纸币。例如1元、2元、5元、10元、20元、50元、100元的纸币分别有若干张,要用这些钱来支付K元,每一步尽可能用面值大的纸币即可。在程序中可以事先将纸币面值按照从小到大的顺序排好,然后按照贪心策略进行找零操作。
  2. 装载古董问题
    • 思路:
      • 先将古董重量升序排序。
      • 按顺序依次往船上装古董,用一个变量记录已装载到船上的古董重量,一个变量记录已装载的古董个数,只要已装载重量小于等于载重量就继续装载,否则停止,最后得到能装入的古董最大数量。
  3. 宝物运输问题
    • 思路:
      • 首先根据宝物的单位价值从大到小排序(单位价值 = 价值/重量)。
      • 按照排好的顺序贪心选择宝物,若宝物的重量小于毛驴剩下的承载能力就全部装入,更新毛驴的承载能力和已运走宝物价值之和;若宝物的重量大于毛驴剩下的承载能力就部分装入(根据剩余承载能力按比例计算价值),最后得到装入宝物的最大价值。

标签:问题,C++,选择,算法,最优,宝物,贪心
From: https://blog.csdn.net/ticketsge/article/details/142885021

相关文章

  • C/C++简介
    C++的定义和历史‌12C++(cplusplus)是一种计算机高级程序设计语言,由C语言扩展升级而产生,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔实验室研发。C++既可以进行过程化程序设计,又可以进行面向对象的程序设计,支持多重编程范式。C++的特点和用途C++是一种静态数据类型检查......
  • 实验一c++
    实验任务一源代码:1#include<iostream>2#include<string>3#include<vector>4#include<algorithm>56usingnamespacestd;78//声明9//模板函数声明10template<typenameT>11voidoutput(constT&c);1213//普通函......
  • 实验1现代c++初体验
    实验1:1#include<iostream>2#include<string>3#include<vector>4#include<algorithm>56usingnamespacestd;78template<typenameT>9voidoutput(constT&c);1011voidtest1();12voidtest2();13......
  • 实验1 现代C++基础编程
    实验结论1.实验任务1代码:1#include<iostream>2#include<string>3#include<vector>4#include<algorithm>56usingnamespacestd;78template<typenameT>9voidoutput(constT&c);1011voidtest1();12void......
  • 基于Spring Boot+Vue的医疗健康的便民服务平台系统的设计与实现(协同过滤算法、实时聊
    ......
  • day05-Lambda、方法引用、算法、正则表达式
    day05-算法和数据结构一、Arrays类接下来我们学习的类叫做Arrays,其实Arrays并不是重点,但是我们通过Arrays这个类的学习有助于我们理解下一个知识点Lambda的学习。所以我们这里先学习Arrays,再通过Arrays来学习Lamdba这样学习会更丝滑一些_.1.1Arrays基本使用我们先认识一下Arr......
  • 基于牛顿拉夫逊算法优化长短期记忆网络结合注意力机制(NRBO-LSTM-Attention)(多输入多
    文章目录效果一览文章概述部分源码参考资料效果一览文章概述基于牛顿拉夫逊算法优化长短期记忆网络结合注意力机制(NRBO-LSTM-Attention)(多输入多输出)(多输入多输出)MATLAB完整源码和数据纯手工制作,代码质量极高,注释清晰,excel数据,方便替换1.data为数据集,10个......
  • 实验1 现代C++编程初体验
    task1:代码:1//现代C++标准库、算法库体验2//本例用到以下内容:3//1.字符串string,动态数组容器类vector、迭代器4//2.算法库:反转元素次序、旋转元素5//3.函数模板、const引用作为形参67#include<iostream>8#include<string>9#inc......
  • Qt/C++开源控件 圆形进度条
    Qt/C++开源控件圆形进度条简约风格:设计简洁,没有多余的元素,清晰地显示了当前进度。颜色对比:使用了亮色的蓝色来标示进度,与深色背景形成鲜明对比,使得进度指示一目了然。清晰的刻度:刻度线清晰,尽管没有标注所有数字,但通过较长的刻度线在50和100的位置,用户可以很容易地估计......
  • 【算法题解记录】_1
    目录【算法题解记录】_1leetcode_115题【算法题解记录】_1还是干这个事了,要吃饭嘛,决定把在解题或者解完题进一步优化的时候,发现的有意思的地方记录一下leetcode_115题动态规划解的字符串匹配,矩阵全部都遍历,用时比较长,发现排在网友们的末尾纸上画了一下矩阵,行数代表被匹配串s......