目录

  • 一、贪心算法的基本定义和特点
  • 二、贪心算法的基本步骤
  • 三、实例分析
    • 1.问题
    • 2.例子与分析
    • 3.代码编写(MATLAB版贪心算法)

一、贪心算法的基本定义和特点

  • 贪心算法的英文是greedy algorithm,又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。

  • 贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。

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

  • 贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。 由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。在不同情况,选择最优的解,可能会导致辛普森悖论(Simpson’s Paradox),不一定出现最优的解。

二、贪心算法的基本步骤

  1. 步骤1:从某个初始解出发;

  2. 步骤2:采用迭代的过程,当可以向目标前进一步时,就根据局部最优策略,得到一部分解,缩小问题规模;

  3. 步骤3:将所有解综合起来。

三、实例分析

1.问题

换酒问题题目:
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。
如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。
请你计算最多能喝到多少瓶酒?

2.例子与分析

  • 示例 1
    输入:numBottles = 9, numExchange = 3 输出:13
    解释:你可以用 3 个空酒瓶兑换 1 瓶酒。喝完9瓶酒后(得到9个空瓶)可以兑换得到3瓶酒,再喝完这3瓶酒后(得到3个空瓶)又能兑换得到1瓶酒。所以最多能喝到 9 + 3 + 1 = 13 瓶酒。

  • 示例 2
    输入:numBottles = 15, numExchange = 4 输出:19
    解释:你可以用 4 个空酒瓶兑换 1 瓶酒。所以最多能喝到 15 + 3 + 1 = 19 瓶酒。喝完15个瓶酒后(得到15个空瓶)可以兑换3瓶酒(此时剩余3个空瓶);喝完这3瓶酒后(得到3个空瓶,此时剩余3+3=6个空瓶)又能兑换1瓶酒(此时剩余2个空瓶);喝完这1瓶酒后(得到1个空瓶,此时剩余1+2=3个空瓶),手上的空瓶不足以兑换出一瓶酒,停止。

  • 分析
    这道题贪心的维度非常明显,直接暴露在题目表面,即当前喝完所有饮料后变为空瓶加上已有空瓶后,最大限度的、贪心的兑换饮料,依次类推,直到手上的空瓶不足以兑换出一瓶饮料止

3.代码编写(MATLAB版贪心算法)

% greedy algorithm(GA)贪心/贪婪算法%购入了 numBottles 瓶酒
num_bottles = input('please input the number of bottles:');
%用 numExchange 个空酒瓶可以兑换一瓶新酒
num_exchange = input('please input the number of exchange:');%初始化
sumb = num_bottles;  % 喝到酒的数目
empty = num_bottles;  % 空瓶数目%贪心:当前喝完所有饮料后变为空瓶加上已有空瓶后,最大限度的、贪心的兑换饮料,依次类推,
% 直到手上的空瓶不足以兑换出一瓶饮料止。while fix(empty / num_exchange) ~= 0 % fix函数用于取整数商,表示当前空瓶还能兑换酒时:进入循环;否则不足以兑换酒:循环退出bottle = fix(empty / num_exchange);  % 利用当前空瓶最大限度地兑换酒,得到当前酒的数目sumb = sumb + bottle;  % 更新喝到酒的数目empty = mod(empty,num_exchange) + bottle; %更新空瓶数目:空瓶=兑换后剩余空瓶+兑换得到的酒瓶
endsumb %最终喝到酒的瓶数

Matlab-贪心/贪婪算法相关推荐

  1. 【无标题】贪心算法-MATLAB实现

    贪心算法-Matlab实现 贪心算法的基本原理 贪心算法的性质 例题 找零钱问题 空瓶换酒问题 活动安排问题 贪心算法的局限性 贪心算法的基本原理 贪心算法是使所做的选择看起来都是当前最佳的,期望通过 ...

  2. 57 - 算法 -贪心算法 - 区间不相交问题

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cmath ...

  3. 分治法、动态规划、贪心算法区别

    联系 分治.动态规划.贪心算法都是把一个大的问题给分解成子问题,通过解决子问题来最终解决原问题的. 区别 分治: 子问题不重复时候更适合,重复也能用,效率低,最好动态规划. 动态规划: 重复的公共子问 ...

  4. matlab求解集合覆盖问题,贪心算法实践之集合覆盖问题

    介绍 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法 贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解 ...

  5. 【控制】贪心算法(GA,Greedy Algorithm)及 Matlab 实现

    文章目录 算法思路 应用实例 仿真 Ref. 算法思路 贪心算法一般按如下步骤进行: 建立数学模型来描述问题. 把求解的问题分成若干个子问题. 对每个子问题求解,得到子问题的局部最优解. 把子问题的解 ...

  6. MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”【含matlab源代码】

    前言 快速平方根倒数算法(Fast InvSqrt)是一种快速计算平方根的倒数的算法,常用于向量标准化运算,在光照渲染中有重要应用.此算法最早可能是于90年代前期由SGI所发明,后来于1999年在&l ...

  7. rgv动态调度MATLAB代码,基于贪心算法的智能RGV的动态调度策略

    李胜成 摘  要:一种智能加工系统由8台计算机数控机床(CNC).1辆轨道式自动引导车(RGV).1条RGV直线轨道.1条上料传送带.1条下料传送带等附属设备组成.文章通过研究RGV的选择判断规律,以 ...

  8. 【算法图解】 之 [贪婪算法(贪心算法)] 详解

    入门算法学习,看的第一本是深入浅出的<算法图解>一书,本博客是对<算法图解>一书的学习笔记,将书中的分享的算法示例用Python3语言实现. 如果你也想要阅读这本书,百度云盘链 ...

  9. 部分背包的贪婪算法 java_使用JAVA实现算法——贪心算法解决背包问题

    packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException ...

最新文章

  1. 开发一个微信小程序贵不贵,需要花费多少钱?
  2. ARM嵌入式系统malloc的实现(C源码)
  3. VS Code 变身约会利器!以码会友,轻松找到心仪的TA!
  4. STAR直接就可以输出readsCount,为什么还需要featurecounts?
  5. 【报告分享】企鹅智家智慧社区解决方案2019.pdf(附下载链接)
  6. Android自动化测试之MonkeyRunner使用
  7. (转)UIWebView的基本用法,适合新手
  8. 使用 django middleware 和 celery 隔离业务系统和积分系统的尝试
  9. c语言标识符的语法规定,C语言语法规则.doc
  10. opencv:image-imageData+image-widthStep*i)[j]表达式含义
  11. golang 如何识别不同语言
  12. 基于445端口漏洞的入侵测试
  13. maccms-cve_2017_17733漏洞复现
  14. 简单欧拉公式c语言算法,算法之_欧拉公式
  15. HTTP 返回状态码
  16. 如何通过知识付费盈利,实现内容变现?
  17. Cameralink转VGA接口转换模块
  18. 【2016浴雨沐风】(第一篇)
  19. 手机控制NodeMCU实现远程电脑开关机
  20. Java农历(阴历)工具类

热门文章

  1. 单应矩阵(Homography)基本概念和代码测试
  2. 第十七届智能车竞赛英飞凌专题培训 ——英飞凌无刷电机驱动专题
  3. 为什么150kHz定位,距离越远接收信号越强呢?
  4. 是否患有新冠肺炎? 你咳嗽一声
  5. 删除sybase里面的锁_一起来学习分布式锁
  6. mysql必知必会_《MySQL必知必会》学习小结
  7. python中的 2%s何意_python中的%s%是什么意思
  8. cpu多核 node 单线程_详解node单线程实现高并发原理与node异步I/O
  9. ssd网络结构_SSD论文与代码详解
  10. FTP 服务搭建及常用的命令脚本及传输协议基础普及