贪婪算法的分析与实现

python算法之贪婪算法 1、什么是贪婪算法 贪婪指的是总是做出当前最好的选择,只关注眼前利益,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案。虽然看起来比较短视,没有长远眼光,但在某些时候贪婪算法会取得比较好的收益。 2、贪婪算法举例 1.算法训练:最大最小公倍数` 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。 输入格式 输入一个正整数N。 输出格式 输出一个整数,表示你找到的最小公倍数。 样例输入 9 样例输 阅读详情

1. 贪心法(Greedy Algorithm)定义

        求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择;

        贪心法就是这样的算法:它在每个决策点作出在当时看来最佳的选择,即总是遵循某种规则,做出局部最优的选择,以推导出全局最优解(局部最优解->全局最优解)

2. 对贪心法的深入理解

        (1)原理:一种启发式策略,在每个决策点作出在当时看来最佳的选择

        (2)求解最优化问题的两个关键要素:贪心选择性质+最优子结构

         ①贪心选择性质:进行选择时,直接做出在当前问题中看来最优的选择,而不必考虑子问题的解;

         ②最优子结构:如果一个问题的最优解包含其子问题的最优解,则称此问题具有最优子结构性质

        (3)解题关键:贪心策略的选择

        贪心算法不是对所有问题都能得到整体最优解的,因此选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

        (4)一般步骤:

        ①建立数学模型来描述最优化问题;

        ②把求解的最优化问题转化为这样的形式:对其做出一次选择后,只剩下一个子问题需要求解;

        ③证明做出贪心选择后:

                1°原问题总是存在全局最优解,即贪心选择始终安全;

                2°剩余子问题的局部最优解与贪心选择组合,即可得到原问题的全局最优解。

                并完成2°

3. 贪心法与动态规划

        最优解问题大部分都可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,大部分情况下这是不可行的。贪心算法和动态规划本质上是对子问题树的一种修剪,两种算法要求问题都具有的一个性质就是子问题最优性(组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的)。动态规划方法代表了这一类问题的一般解法,我们自底向上构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中的最优值作为自身的值,其它的值舍弃。而贪心算法是动态规划方法的一个特例,可以证明每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。

案例:

 投币数量最少问题

        有1元、5元、10元、50元、100元、500元的硬币各C1, C5, C10, C50, C100, C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?若有解,输出最少硬币数;否则输出“-1”(0<=C1, C5, C10, C50, C100, C500<=109,0<=A<=109)

代码分析:

/*
有1元、5元、10元、50元、100元、500元的硬币各C1, C5, C10, C50, C100, C500枚。
现在要用这些硬币来支付Pay_x元,最少需要多少枚硬币?若有解,输出最少硬币数;
否则输出“-1”(0<=C1, C5, C10, C50, C100, C500<=10^9,0<=A<=10^9)
分析:用最大面额的硬币来支付,则需要的硬币数量应该最少
规划:局部最优解:面额最大的硬币数量,全局最优解:最少的硬币数量
*/
#include <iostream>
#include <vector>
#include <stdlib.h>
#define Max(a,b)    (((a) > (b)) ? (a) : (b))
#define Min(a,b)    (((a) < (b)) ? (a) : (b))
#define MAX_SIZE 6
using namespace std;
const int  moneyVal[MAX_SIZE] = { 1, 5, 10, 50, 100, 500 };//硬币的面值
int moneynum[MAX_SIZE] = {0};//每种面值硬币的数量
int Sum = 0;
int ret[MAX_SIZE] = { 0 }/*每种硬币使用的 个数*/;
int main(int argc, char *argv[])
{
	int Pay_x = 0, num = 0;//
	cout << "请输入需要支付的金额!" << endl;
	cout << ": ";    cin >> Pay_x;

	cout << "请输入你拥有每种硬币的个数:" << endl;
	for (int i = 0; i < MAX_SIZE; ++i)
	{ 
		//int _moneynum = 0;
		cout << ": ";	cin >> moneynum[i];

		cout << "面值为 " << moneyVal[i] << " 元的硬币有 " << moneynum[i] << " 枚" << endl;
	}
	cout << endl;
	for (int j = MAX_SIZE - 1; j >= 0; --j)
	{
		/*temp记录使用硬币j的枚数,其值<=moneyVal[j]*/
		int temp = (Pay_x / moneyVal[j]);
		num=Min(temp, moneynum[j]);
		/*Pay_x剩余未支付的硬币*/
		Pay_x -= num*moneyVal[j];
		/*记录第j中面值的硬币使用的个数*/
		ret[j] = num;
		/*记录总共使用的硬币的个数*/
		Sum += num;
	}
	if (Pay_x > 0)
	{
		cout << "所有的硬币不足以支付需要支付的金额!" << endl;
	}
	cout << "所需最少的硬币数量为:" << num << " 枚" << endl;
	for (int i = 0; i < MAX_SIZE; ++i)
	{
		cout << "面值为 " << moneyVal[i] << " 的硬币使用了 " << ret[i] << " 枚" << endl;
	}
	system("pause");
	return 0;
}

 

Facebook登录协议逆向实战:从加密参数到完整流程解析(附Python代码) 本文深入解析了Facebook登录协议的逆向工程实战,详细拆解了从关键加密参数(如`lgndim`、`encpass`)定位到完整登录流程的实现。文章提供了Python代码示例,重点阐述了加密逻辑的深度解析、加密函数的本地化实现,并解决了Crypto.js异步调用等常见问题,为研究Web安全和协议逆向的开发者提供了实用参考。 阅读详情

相关推荐

ANSYS命令流黑箱揭秘:流体渗透压力载荷的七种收敛优化策略

本文深入解析ANSYS Workbench中流体渗透压力载荷的七种收敛优化策略,重点探讨接触探测点迭代逻辑、PPCN阈值动态调整及FPAT参数优化等关键技术。通过命令流示例和实战技巧,帮助工程师有效解决流体与结构相互作用仿真中的收敛难题,提升计算效率和精度。

weixin_29274337的博客 523

算法设计与分析2023秋-头歌客观题-张超(云南农业大学)

B、该问题的分支限界法一般采用优先队列实现,且优先级可根据结点所对应的当前路长确定。B、当采用深度遍历方式遍历装载问题的解空间树时,可以采用左儿子限界右儿子。C、当采用宽度遍历方式遍历装载问题的解空间树时,可以采用左儿子限界右儿子。B、回溯法从求解可行解入手,而采用优先队列的分支限界法可直接求解最优解。A. 分治法是将大规模问题分解为规模较小的多个子问题进行求解的方法。D、回溯法和分治限界法的主要区别在于针对解空间树的搜索方式不同。A、分支限界法和回溯法求解的问题时都需要构造问题的解空间树。

杨明金的博客 2550

如何使用安路TD与Modelsim进行联合仿真?

1)安装安路FPGA开发软件;(本次实验使用版本:TD_5.6.3_Release)2)安装Modelsim仿真软件;(本次实验使用版本:Modelsim SE-64 10.1c)3)FPGA开发板;(本次实验使用型号:EG4X20BG256)4)LED点灯例程;

qq_17313923的博客 3222

贪心算法的基本原理和实现方法(java)

贪心算法: 1)、贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法 2)、贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果 贪心算法最佳应用-集合覆盖 假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到...

qq_41291067的博客 2728

3DMax高效建模与人工智能:一场颠覆传统创作的效率革命

AI与3DMax的结合,不仅是工具效率的升级,更是一场创作范式的革命。从“手动雕刻”到“智能共生”,设计师的角色正从执行者转向决策者。正如网友所言:“AI不是替代人类,而是赋予凡人以神笔。”在这场变革中,唯有拥抱技术、深耕创意,方能在数字艺术的浪潮中立于潮头。参考文献与工具推荐技术原理:火星时代资讯《人工智能和三维建模》工具实测:哔哩哔哩《tyDiffusion 3dsMax应用》9、Tripo AI官网教育案例:原创论文《人工智能技术介入三维动画课程建设》

m0_46478534的博客 3016

群晖Docker安装GitLab

external_url ‘http://lanweixia.synology.me’ 这种情况访问页面的时候加上端口没问题,但是会导致http的克隆地址没有端口。external_url ‘http://lanweixia.synology.me:8000’ 加端口的话,又会导致页面访问不了,Gitlab也一直处于启动状态。​ 完成以后修改docke—>gitlab—>config---->gitlab.rb。就是上面改的端口(docker的端口)首次进入,会设置密码,这个密码就是用户名。

Lim的博客 9113

贪心算法(贪婪算法)

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

back_room的博客 2723

基于C#的ASP.NET开发的党史学习网站课设

开展党史学习教育,就是要以史为镜、以史明志,把苦难辉煌的过去、日新月异的现在、光明宏大的未来贯通起来,在鉴往知来中砥砺前行,在乱云飞渡中把准航向,在凝心聚力中团结奋斗,共同创造新的历史伟业。登陆按钮与数据库进行连接,逻辑实现是如图3.1.3所示,自己定义一个SQL查询语句,将账号、密码放入SQL查询语句中,用sqlDataReader.HasRows语句进行逐一比较,找出结果,将用户名存入session并调用cookies,如果结果存在就关闭数据库,进行数据跳转,并弹出登陆成功的提示框,并关闭数据库。

m0_62408555的博客 974

【算法】贪婪算法介绍及实现方法

贪婪算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪婪算法通常用于解决优化问题,如最小化成本、最大化收益等。它并不保证得到最优解,但在很多问题中,它能产生很好的近似解或最优解。贪婪算法的关键在于贪心选择性质:每一步所做的选择都是当前状态下的最优选择,并且这种选择不会依赖于子问题的解。

Xiaoxin的博客 647

MCP+A2A:从实验室到生产环境的落地之旅

本文通过实际项目中的落地案例,展示了 MCP+A2A 协议结合使用的强大功能和广泛适用性。同时,我们也探讨了开发者社区的贡献、与其他技术的融合,以及未来技术趋势的展望。希望本文能够帮助读者更好地理解如何将这一架构从实验室推向生产环境,推动 AI 技术的实际应用。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1495

【YOLO系列】YOLOv11详解:模型结构、损失函数、训练方法及代码实现

YOLOv11在目标检测领域实现重大突破,通过动态骨干网络(Dyna-Backbone)和FPN++架构,在保持高帧率(≥60FPS)的同时提升小目标检测精度(AP_S提升5.6%)。创新采用CIoU++损失函数和类别平衡Focal Loss,结合Mosaic-Plus数据增强,参数量减少18%至6.5M。实验显示,该模型在COCO数据集上实现更高mAP,特别适合移动端部署,Jetson Xavier平台能耗比优化至3.2W·ms⁻¹,支持目标检测、实例分割等多任务场景。关键创新包括动态深度调整和双向特征金

一碗白开水一 3444

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

哈夫曼编码的解决方案是这样的:不断找到当前出现频率最小的两个结点(字符或频率),将它们结合,作为一个新生成的结点的左右子结点,并将新生成的结点继续放入比较,直到没有落单的字符。②每次都从还未访问的顶点中选择与当前巨型防护罩最近的顶点(记为Vk(0≤k≤5)),使用“爆裂模式”的能力恢复这条最近的边(并成为最小生成树中的一条边),前往访问。如果我们已知各字符在文本中的出现频率,考虑到为了让压缩后的数据更小,我们直觉是让出现频率高的字符用尽可能短的编码,而出现频率高的则可以用更长的编码。

Mrsgflmx的博客 1万+

《python算法与数据结构2000讲》算法与数据结构总结

《python算法与数据结构2000讲》算法与数据结构总结

IT 甄选推荐 1104

剪绳子 - 贪婪算法 - Java实现

16. 剪绳子 - 贪婪算法 问题描述 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n&amp;gt;1并且m&amp;gt;1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18. 分析 n&amp;lt;2时,返回0;n=2时,返回1;n=3时,返回2 根据...

不准动我的小老弟 490

VC中sqlite的使用

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

ssm框架搭建

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

动态规划、贪婪算法 - 13.剪绳子

剪绳子是动态规划和贪婪算法是典型问题。 动态规划分析: 我们先来简短的讲解什么是动态规划? 动态规划是将一个大问题分解为小问题,小问题种还有小问题,我们对最小单位的小问题求最优解之后,那么向上推进,大问题也就是最优解了。 动态规划的运用范围: 如果面试题是求一个问题的最优解(通常是求最大值和最小值),而且该问题的能够分成若干个子问题,并且子问题之间还有重叠的更小的子问题,那么就可以考虑使用动态规...

weixin_44916741的博客 268

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

贪婪算法_换零钱(C语言)

贪婪算法思路: 从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快地求得更好的解。当达到算法种的某一步不能继续前进时,就停止算法,给出近似解。 由贪婪算法的特点和思路可看出,该算法存在以下问题: (1)不能保证最后的解是最优的; (2)不能用来求最大或最小解问题; (3)只能求满足某些约束条件的可行解的范围。 实例:换零钱 人民币有100、50、10、5、2、1、0.5、0.2、0.1等多种面...

carakia的博客 1557

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

贪婪算法+小应用(调度问题)

【0】README0.1) 本文总结于 数据结构与算法分析, 旨在 理解 “DFS应用——贪婪算法” 的idea;【1】贪婪算法1.1)已经看到的三个贪婪算法: Dijkstra算、Prim算法 和 Kruskal 算法;(Dijkstra 寻找一个顶点到其他顶点的最短路径, Prim算法是选取顶点以找出最小生成树, Kruskal算法是一次选取权值最小的边 建立最小生成树) 1.2)贪婪算法是

PacosonSWJTU的博客 3347

【每天学一点 - 算法篇 - 设计技巧 - 贪婪算法】

文章目录前言一、什么是贪婪算法二、贪婪算法原理1、示例2、思路3、抽象总结 前言 我是一个莫的感情的码字机器 一、什么是贪婪算法 祖传手法之“望文生义”, 贪婪贪婪,就是一个字,贪 只要我够贪,我就是最后获得胜利的人。 对于部分场景来说,只要在每一个局部够贪, 最后就能获得最佳结果, 有时即使不是最优秀的结果, 大多数时候也是能达到比较优秀的结果, 而大多数实际场景应用中也正是这个比较优秀的结果就能达到需求了, 所以贪婪算法在实际应用中还是能偶尔看到一些影子的。 二、贪婪算法原理 1、示例 给你 n

破晓星芒的博客 363

贪婪算法—拓扑排序

文章目录前言贪婪算法贪婪算法的应用1)AOV网的拓扑排序算法 前言 这一部分,数据结构已经不再重要了,开始进入到了算法设计的领域。在《数据结构、算法与应用》一书中,描述了一部分重要的算法设计方法,包括贪婪算法、分治算法、动态规划、回溯和分支定界。并且对于算法的讨论不如《算法导论》中细致周密。数据结构专栏暂时只关注贪婪、分治和动规三种算法设计方法。 贪婪算法 贪婪算法的算法设计思想,每一步,我们都在一定的标准下,作出一个最优决策。在每一步做出的决策,在以后的步骤中都不可更改。做出决策所依据的标准称为贪婪准则。

夜的第七章 1054

贪婪算法找硬币matlab,贪婪算法-装箱问题等练习

贪婪算法练习练习题1:考虑1、8、9、11这四种面值的硬币,要找出币值24的零钱,怎么找能使硬币数最少? 利用matlab编程求解。解:设为二进制变量,如果硬币j被选中,则,=1,否则=0,则找硬币问题的数学模型如下:min ;;用贪婪算法求解,其MATLAB程序如下:function [n,x]=payback(v,y,m)[m,n]=size(y);for i=1:nfor j=1:n练习题2...

weixin_29435115的博客 661

数据结构与算法--贪婪算法

贪婪算法 上一篇:数据结构与算法–图论-深度优先搜索及其应用

0102的博客 717

leetcode之贪婪算法

贪婪算法(不怎么重要) 定义 贪婪是一种在每一步中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法 优点 缺点 往往,它得到的结果并不是正确的 总是做出在当前看来是最好的选择 不从整体的角度去考虑,仅对局部的最优解感兴趣 什么问题使用贪婪算法 只有当哪些局部最优策略能产生全局最优策略的时候 ...

ZHOUJIAN_TANK的博客 350

【数据结构与算法】贪婪算法

例如,有活动A(1,4)、活动B(3,5)、活动C(0,6)、活动D(5,7)、活动E(8,9)(这里括号内的数字分别表示活动的开始时间和结束时间)。首先选择活动A,因为它结束时间最早,然后活动B因为其开始时间3大于活动A的结束时间4,所以可以选择,而活动C因为开始时间0小于活动A的结束时间4,不能选择。按照这种方式,最后可以选择活动A、B、E,这是一种最优的活动安排方案。如果有1元、5角、1角的硬币,当要凑出8角时,贪婪算法会优先选择5角,然后选择3个1角,在每一步都选择当前能使剩余金额减少最多的硬币。

chinansa的博客 1350

贪婪算法之最大相容集合

贪婪算法的基本思想 求解最大相容集合

JingYi的专栏 3012

贪婪算法---二分覆盖

二分图是一个无向图,它的n 个顶点可二分为集合A和集合B,且同一集合中的任意两个顶点在图中无边相连(即任何一条边都是一个顶点在集合A中,另一个在集合B中)。当且仅当B中的每 个顶点至少与A中一个顶点相连时,A的一个子集A 覆盖集合B(或简单地说,A 是一个覆盖)。覆盖A 的大小即为A 中的顶点数目。当且仅当A 是覆盖B的子集中最小的时,A 为最小覆盖。 例1-10 考察如图1 -

iu_81的专栏 1716

【剑指offer】——由剪绳子问题引出的动态规划和贪婪算法

题目要求 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 1、动态规划分析求解 首先,我们来了解一下动态规划。一般什么问题使用动态规划来求解呢? ...

qq_43412060的博客 146
上一篇: 微分和导数的关系
下一篇: FLANN库介绍及其应用
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值