转载---贪心算法

2023-11-17

转载博主

1.贪心算法简介

1.1 基本定义

在贪婪算法(greedy method) 中,我们要逐步构造一个最优解。每一步,我们都在一定的标准下,做出一个最优决策。做出决策所依据的标准称为贪心准则(greedy criterion)。

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

贪心算法每一步必须满足以下条件:
  1、可行的:即它必须满足问题的约束。
  2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。
  3、不可更改:即选择一旦做出,在算法的后面步骤就不可改变了。

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

1.2 贪心算法案例

钱币找零问题
假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来找给顾客K元,怎么用数目最少的钱来找零?

贪心准则:在不超过要找的零钱总数的条件下,每一次都选择面值尽可能大的纸币,直到凑成的零钱总数等于要找的零钱总数。

#include

using namespace std;

int min(int a, int b) {
return a < b ? a : b;
}
int main()
{
//人民币面值集合
int values[] = { 1, 2, 5, 10, 20, 50, 100 };
//各种面值对应数量集合
int counts[] = { 3, 1, 2, 1, 1, 3, 5 };
//求442元人民币需各种面值多少张
//用来记录需要的各种面值张数
int money = 442;
int len = sizeof(values) / sizeof(values[0]);
int* result = new int[len];
for (int i = len - 1; i >= 0; i–) {
int num = 0; //当前面值纸币的数量
num = min(money / values[i], counts[i]); //当前纸币可以找的最大数量
money = money - num*values[i];
result[i] = num;
}
//输出最后结果
for (int i = 0; i < len; i++) {
if(result[i])
cout << “需要面额为” << values[i] << “的人名币” << result[i] << “张\n”;
}
cout << endl;

system("pause");
return 0;

}

程序结果:

需要面额为2的人名币1张
需要面额为5的人名币2张
需要面额为10的人名币1张
需要面额为20的人名币1张
需要面额为100的人名币4张

可以得出,求出的结果为最优解,但是,当纸币面值和数量为某些特殊情况下,贪心算法就无法给出最优解。但是,贪心算法往往能给出近似解,对于我们来说也是有价值的。

比如对于纸币有1、5、7面值的若干,要凑出10元
贪心解[3,0,1]
最优解[0,2,0]

1.3.贪心算法的基本思路

1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。

2.贪心算法最优性证明

2.1 贪心算法的前提

贪心策略适用的前提是:局部最优策略能导致产生全局最优解。
关键是贪心策略的选择,而贪心算法与动态规划的主要区别是:
贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。即贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。
所以,贪心算法的正确性可以通过数学归纳法或贪心交换来给予证明。

2.2 最优子结构

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。

2.3 贪心算法与动态规划的区别

贪心算法的每一次操作都对结果产生直接影响,而动态规划则不是。
贪心算法对每个子问题的解决方案都做出选择,不能回退;动态规划则会根据以前的选择结果对当前进行选择,有回退功能。
能用贪心解决的问题,也可以用动态规划解决
3.贪心算法的经典问题

3.1 近似解

0/1背包问题
3.2 最优解

拓扑排序
单源最短路径(Dijkstra算法)
最小生成树(Kruskal算法、Prim算法)
连续背包问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转载---贪心算法 的相关文章

  • 华为OD机试 - 快速开租建站(Java)

    题目描述 当前IT部门支撑了子公司颗粒化业务 该部门需要实现为子公司快速开租建站的能力 建站是指在一个全新的环境部署一套IT服务 每个站点开站会由一系列部署任务项构成 每个任务项部署完成时间都是固定和相等的 设为1 部署任务项之间可能存在依
  • 华为od机试题2 真题

    华为od机试题 真题 77 满足最大消费额度 76 小朋友身高位置 75 字符连续出现最大次数 74 最少停车数 73 字母多条件排序 71 交叉排序 70 水仙花数 69 消除相邻且相同字母 以下题目附带Java解法 是我个人写的 不一定
  • RobotFramework入门(二)appUI自动化之app启动

    前言 本章主要讲述appUI自动化的一个小示例 ps 这里虽然是一个小示例 但如果你要通过robot去做appUI自动化 思路都是一样的 可以自行搜索关键字组合去使用 其实正常情况下 我们会直接使用代码去实现自动化 而不是在ride上实行哈
  • discuz主题列表页伪静态化设置方法(lnmp+wamp+lamp通用)

    大家都知道在discuz程序中 伪静态化后 门户文章跟帖子内容都可以设置成功并能正常的访问 但是在论坛帖子的列表页却还是动态的地址 http www 52hgn com forum php gid 40 比如这种 我们想把他变成这种静态地址
  • Java从入门到实战总结-4.4、JDBC

    Java从入门到实战总结 4 4 JDBC 文章目录 Java从入门到实战总结 4 4 JDBC 1 简介 2 JDBC体系结构 3 JDBC核心组件 4 CRUD语法介绍 回顾 5 使用步骤 6 JDBC连接步骤 6 1 JDBC执行SQ
  • ES6非空判断

    es6 Null传导运算符 const firstName message body user firstName default 运算符相当于一种短路机制 只要不满足条件 就不再往下执行 Null 判断运算符 属性的值为null unde
  • gitLens插件简单使用(默认上传github)

    1 安装 在vscode中的插件管理输入如下后下载 GitLens Git supercharged 2 配置 点击文件 首选项 设置 点击右上角设置小图标 3 github使用 首先仓库文件一定是要git init是git所管理的 1 在
  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • 16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器

    最近在项目上遇到 用485协议命令控制灯光继电器的开关需要计算16进制 CRC16 MODBUS RTU通讯 校验码来写控制命令 这种在网上有现成的计算器 我们直接使用即可 以下为我用的一个计算器的链接 个人感觉还是蛮好用的 同时他还涵盖了
  • react Native java JDK与Gradle版本不兼容 构建失败

    react Native 版本介绍 本篇适用react Native已经搭建了java jdk 1 8的版本开发环境 如果需要写0 67版本及以上的项目 现在的gradle版本比较高 比如gradle6 0 构建版本和打包的时候会出现不兼容
  • ThinkPhp5使用bootstrap样式分页

    1 查看分页的配置 在application config php文件中最后 分页配置 paginate gt type gt bootstrap var page gt page list rows gt 15 2 下载 https v3
  • 04-Qt软件加入Log文件输出与终端彩色打印(包含行号)

    一 目的与需求 在开发qt应用程序中 经常使用打印调试软件 qt自己的qDebug 就满足了需求 但是当需要把一部分log记录到文件的时候qt就没有提供了 这个时候可以使用qDebug 的qInstallMsgHandler来指定打印回掉函
  • 软件测试第一阶段:web前端技术基础-16- linux系统安装软件,运用shell脚本等

    一丶yum安装 用yum安装软件分三步 第一步 准备一个软件源 软件源其实就是一个目录 在这个目录中有很多的rpm包 第二步 创建yum的配置文件 文件需要指向到软件源 第三步 用yum进行安装 卸载软件 第一步 配置软件源 1 首选将系统
  • Java基础知识-多态的实现机制

    面向对象设计具备三种特性 封装 继承 多态 多态是面对对象程序设计中代码重用的一个重要机制 它表示当同一个操作作用在不同的对象的时候 会出现不同的语义 从而会产生不同的结果 比如 同样是 操作 3 4用来实现整数的相加 而 3 4 却实现了
  • js取小数点后两位四种方法

    1 通过substring截取 function getnum var num 22 123456 var s num toString var result s substring 0 s indexOf 3 var result2 s
  • 安装Redis数据库

    Redis是一种内存缓存数据库 它可以帮助我们高效地缓存我们的数据 以下是Redis安装步骤 1 在Linux系统安装 安装Redis 在终端中输入以下命令 sudo apt get update sudo apt get upgrade
  • centos下禁用网卡IPv4或者IPv6

    Centos下禁用网卡的ipv4 直接删除网卡的ipv4地址 ip addr del 10 2 21 40 24 dev ens160 启用ip addr add 10 2 21 40 24 dev ens160 禁用ipv6功能 root
  • 讯飞星火,正式开放!

    今日起 讯飞星火认知大模型面向全民开放 在各大主流应用商店搜索 讯飞星火 App 或登录讯飞星火官网均可直接注册使用 专属申请通道 长按内测二维码 点击 申请注册 通过专属二维码 注册免费 秒通过 即刻上手免费体验 无需审核等待 还可以获得
  • 英特尔第十代处理器为什么不支持win7_为什么7代CPU不支持WIN7操作系统?

    说来说去还不是利益驱使 wintel联盟暗地里让客户淘汰旧的硬件旧的系统呗 区区几个驱动对英特尔来讲还不是手到擒来的事 近来市场上英特尔不是又推出了一种新的低端芯片组主板 基于22纳米打造的H310C 原生支持WIN7系统安装 这款芯片组根

随机推荐

  • 嵌入式(exec函数族和守护进程)

    exec 函数族 背景 fork创建进程之后 子进程和父进程执行相同的代码 但是在实际开发当中 我们希望父子进程执行不同的代码 作用 执行指定的程序 include
  • POJ 3259 Wormholes(最短路——Bellman-ford)

    A Wormholes While exploring his many farms Farmer John has discovered a number of amazing wormholes A wormhole is very p
  • Think in Java(一)

    把对象想象为 服务提供者 通常被隐藏的部分是对象内部脆弱的部分 组合和聚合 组合 使用现有的类合成新的 聚合 当组合是动态发生的时候 被称为聚合 组合经常被视为 has a 关系 例如汽车拥有引擎 在建立新类时 应该先考虑组合 因为它更加简
  • EXCEL 如何制作混合数据透视图柱形图添加折线图

    当我们制作了数据透视图 增长率什么的 需要在柱形图上增加折线图 如何做呢 工具 原料 EXCEL2007 方法 步骤 1 新建一个工作表 而后数据入局 制作一个带增长率的数据透视表 2 选中数据 而后在上方功能区找到插入菜单 在下拉选项了里
  • PM 和 PL 的区别

    工作之前只知道PM是项目经理 PL是 项目负责人 看过几本职场小说 据我理解 PM职能更多是在人事和外部资源调度方面 而PL更多在技术层面去领导下面的开发人员 小组有PL PM各一个 同事对待他们的方式给我的理解就是 PM要比PL大 工作汇
  • linux————zabbix搭建

    目录 一 zabbix的概述 二 构成 一 server 二 web页面 三 数据库 四 proxy 五 agent 三 zabbix监控对象 四 zabbix的常用术语 五 zabbix监控框架 一 zabbix client架构 二 z
  • 视频会议用户洞察白皮书

    导读 白皮书重点通过桌面研究和定量调研的方式 对疫情后视频会议行业发展现状 用户行为及需求偏好和用户付费意愿等内容展开研究 以期加深对视频会议行业及用户的了解 希望能为相关企业与资本市场提供参考意见与运营建议 关注公众号 互联互通社区 回复
  • 蓝桥杯国赛 C/C++ ABC组题解(第四届 ~ 第十二届)

    2020年第十一届蓝桥杯国赛 题号 类型 C A组 C B组 C C组 试题A 结果填空 合数个数 美丽的 2 美丽的 2 试题B 结果填空 含 2 天数 日期处理 扩散 BFS 合数个数 试题C 结果填空 本质上升序列 线性DP 阶乘约数
  • karma使用webpack的代码覆盖率测试

    前言 距离上一次博客有2个月了 倒不是没有可写东西就是提不起劲写 不说这些了这次写下我使用 karma webpack 中遇到的代码覆盖率问题 一 karma的使用 自个去搜吧 感觉讲这个的真的多 我就说一些建议 karma的测试框架改用m
  • LVGL 获取光标坐标位置

    为了方便获取物理按键输入的坐标 在仿真时直接开启打印坐标显示 获取自己想要的坐标 核心代码主要接口 indev proc press 打印光标位置 注意要先使能打印开关 LV LOG WARN pressed at x d y d proc
  • HTTP:断点续传原理图文分析

    起源 以前 用户不能使用现在这种高速的带宽访问互联网 当时 下载一个尺寸稍大的图片或文件就已经很吃力了 如果下载过程中遇到网络中断的情况 那就必须重头开始 一 获取部分内容 在HTTP 1 1中 为了解决上述问题 需要一种可恢复的机制 所谓
  • C++ Web服务器 - 用户登录(三)

    newobj跨平台开发框架 https github com Liuccysdgg newobj 本片着重介绍 MYSQL连接池 HTTP静态文件响应 部分JS等 效果演示 一 MYSQL连接池 如果每次业务请求进来时去创建mysql连接并
  • Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime问题解决

    Node Sass does not yet support your current environment Windows 64 bit with Unsupported runtime问题解决 运行原先vue程序时 npm run d
  • Typescript、VUE3的相关介绍

    一 Typescript 1 TypeScript 的由来 TypeScript 是由微软开发的一款开源的编程语言 TypeScript 是 Javascript 的超集 遵循最新的 ES6 ES5 规范 TypeScript 扩展了 Ja
  • 动态规划问题——最长上升子序列(LIS)(一)

    原文转载自我的博客benym cn 推荐链接 动态规划问题 最长上升子序列 LIS 二 动态规划问题 最长上升子序列 LIS 三 如 求 2 7 1 5 6 4 3 8 9 的最长上升子序列 我们定义d i i 1 n 来表示前i个数以A
  • chatgpt赋能Python-python2_7如何安装

    Python 2 7如何安装 Python 2 7是一个广泛使用的Python版本 其可以在Windows和Linux上安装 本文将介绍Python 2 7如何安装 并提供相关步骤和指南 下载Python 2 7 首先 您需要下载Pytho
  • Python for循环嵌套

    视频版教程 Python3零基础7天入门实战视频教程 在有复杂应用的时候 我们可以通过for循环的嵌套来实现 比如打印二维的行列 这里先学习下range 方法 获取一个数字序列 案例 range stop 返回0到stop 1的数字序列 f
  • SQL 通配符

    在 SQL 中 通配符与 SQL LIKE 操作符一起使用 SQL 通配符用于搜索表中的数据 在 SQL 中 可使用以下通配符 通配符 描述 替代 0 个或多个字符 替代一个字符 charlist 字符列中的任何单一字符 charlist
  • Angular项目配置本地https访问

    Angular项目配置本地https访问 首先 先创建一个项目 d work learn ng new angular https 然后cd到刚生成的项目的根目录 建立一个cert目录 用于存放我们的密钥证书等文件 cd angular h
  • 转载---贪心算法

    转载博主 1 贪心算法简介 1 1 基本定义 在贪婪算法 greedy method 中 我们要逐步构造一个最优解 每一步 我们都在一定的标准下 做出一个最优决策 做出决策所依据的标准称为贪心准则 greedy criterion 贪心算法