算法分析与设计实验:找零钱问题的贪心算法与动态规划解决方案
在计算机科学中,贪心算法和动态规划是两种常用的算法设计策略。本文将通过一个经典的找零钱问题,详细讲解这两种算法的实现和应用。我们将会提供完整的C++代码,并对代码进行详细解释,帮助读者更好地理解和掌握这两种算法。
问题描述
找零钱问题是这样一个问题:给定不同面值的零钱和一个总金额,如何使用最少数量的零钱来凑出这个总金额。例如,假设我们有面值为1、5、14、18的零钱,需要凑出28元,那么可能的解包括:28=18+5+5 或 28=14+14。
输入输出格式
输入:
-
第一行:两个整数,分别表示零钱的种类数和需要凑的总金额。
-
第二行:若干个整数,表示每种零钱的面值。
输出:
-
分别输出贪心算法和动态规划算法得到的找零方案。
算法分析
贪心算法
贪心算法的核心思想是在每一步选择中都采取当前状态下最优的选择,从而希望导致最终结果最优。在找零钱问题中,贪心算法的策略是每次选择面值最大的零钱,尽可能多地使用这种零钱,直到无法再使用为止,然后继续选择次大的零钱,依此类推。
动态规划算法
动态规划算法通过把原问题分解为多个子问题来求解。对于找零钱问题,我们可以定义一个数组dp,其中dp[i]表示凑出金额i所需的最少零钱数量。通过填充电动态规划表,我们可以得到凑出总金额的最少零钱数,并通过回溯得到具体的找零方案。
代码实现
以下是使用C++实现的找零钱问题解决方案:
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>using namespace std;vector<int> greedyCoinChange(int Y, vector<int> coins) {sort(coins.rbegin(), coins.rend()); // 降序排列vector<int> result;int remaining = Y;for (int coin : coins) {while (remaining >= coin) {result.push_back(coin);remaining -= coin;if (remaining == 0) break;}if (remaining == 0) break;}return result;
}vector<int> dpCoinChange(int Y, vector<int>& coins) {vector<int> dp(Y + 1, INT_MAX); vector<int> coinUsed(Y + 1, 0); dp[0] = 0;for (int i = 1; i <= Y; ++i) {for (int coin : coins) {if (coin <= i && dp[i - coin] != INT_MAX && dp[i - coin] + 1 < dp[i]) {dp[i] = dp[i - coin] + 1;coinUsed[i] = coin;}}}vector<int> result;int current = Y;while (current > 0) {int coin = coinUsed[current];result.push_back(coin);current -= coin;}// 动态规划结果按降序排列sort(result.rbegin(), result.rend());return result;
}int main() {int n, Y;cin >> n >> Y;vector<int> coins(n);for (int i = 0; i < n; ++i) {cin >> coins[i];}// 贪心算法直接处理降序vector<int> greedyResult = greedyCoinChange(Y, coins);// 动态规划处理后排序vector<int> dpResult = dpCoinChange(Y, coins);// 格式化输出cout << Y << "=";for (size_t i = 0; i < greedyResult.size(); ++i) {if (i != 0) cout << "+";cout << greedyResult[i];}cout << endl;cout << Y << "=";for (size_t i = 0; i < dpResult.size(); ++i) {if (i != 0) cout << "+";cout << dpResult[i];}cout << endl;return 0;
}
代码解析
贪心算法函数 greedyCoinChange
-
将零钱面值按降序排列,这样可以优先使用面值较大的零钱。
-
初始化一个空向量
result
来存储找零方案。 -
使用一个循环遍历每种面值的零钱,尽可能多地使用当前面值的零钱。
-
当剩余金额为零时,结束循环并返回找零方案。
动态规划函数 dpCoinChange
-
初始化一个动态规划数组
dp
,其中dp[i]
表示凑出金额i
所需的最少零钱数量。 -
初始化一个数组
coinUsed
来记录凑出每个金额时使用的最后一个零钱面值。 -
使用嵌套循环填充电动态规划表,外层循环遍历金额,内层循环遍历零钱面值。
-
通过回溯
coinUsed
数组构造找零方案。
示例输入与输出
输入
4 28
1 5 14 18
输出
28=18+5+5
28=14+14
总结
本文通过一个具体的找零钱问题,详细介绍了贪心算法和动态规划算法的实现过程。贪心算法简单直观,但在某些情况下可能无法得到最优解。而动态规划算法虽然时间复杂度较高,但可以保证得到最优解。在实际应用中,我们可以根据问题的具体特点选择合适的算法。希望本文能够帮助读者更好地理解和掌握这两种重要的算法设计策略。
相关文章:
算法分析与设计实验:找零钱问题的贪心算法与动态规划解决方案
在计算机科学中,贪心算法和动态规划是两种常用的算法设计策略。本文将通过一个经典的找零钱问题,详细讲解这两种算法的实现和应用。我们将会提供完整的C代码,并对代码进行详细解释,帮助读者更好地理解和掌握这两种算法。 问题描述…...

制作 MacOS系统 の Heic动态壁纸
了解动态桌面壁纸 当macOS 10.14发布后,会发现系统带有动态桌面壁纸,设置后,我们的桌面背景将随着一天从早上、到下午、再到晚上的推移而发生微妙的变化。 虽然有些软件也有类似的动态变化效果,但是在新系统中默认的HEIC格式的动…...

大数据 笔记
kafka kafka作为消息队列为什么发送和消费消息这么快? 消息分区:不受单台服务器的限制,可以不受限的处理更多的数据顺序读写:磁盘顺序读写,提升读写效率页缓存:把磁盘中的数据缓存到内存中,把…...
js中encodeURIComponent函数使用场景
encodeURIComponent 是 JavaScript 中的一个内置函数,它的作用是: 将字符串编码为可以安全放入 URL 的形式。 ✅ 为什么需要它? URL 中有一些字符是有特殊意义的,比如: ? 用来开始查询参数 & 分隔多个参数 连接…...
iOS工厂模式
iOS工厂模式 文章目录 iOS工厂模式简单工厂模式(Simple Factory)工厂方法模式(Factory Method)抽象工厂模式(Abstract Factory)三种模式对比 简单工厂模式(Simple Factory) 定义&am…...

【数据库】-1 mysql 的安装
文章目录 1、mysql数据库1.1 mysql数据库的简要介绍 2、mysql数据库的安装2.1 centos安装2.2 ubuntu安装 1、mysql数据库 1.1 mysql数据库的简要介绍 MySQL是一种开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前…...
【缓存】JAVA本地缓存推荐Caffeine和Guava
🌟 引言 在软件开发过程中,缓存是提升系统性能的常用手段。对于基础场景,直接使用 Java集合框架(如Map/Set/List)即可满足需求。然而,当面对更复杂的缓存场景时: 需要支持多种过期策略&#x…...
Prometheus的服务命令和配置文件
一、Prometheus的服务端命令和启动方式 1.服务端命令(具体详情可以--help查看) --config.file“prometheus.yml”指定配置文件,默认是当前目录下的prometheus.yml--web.listen-address"0.0.0.0:9090"web页面的地址与端口…...

物流项目第五期(运费计算实现、责任链设计模式运用)
前四期: 物流项目第一期(登录业务)-CSDN博客 物流项目第二期(用户端登录与双token三验证)-CSDN博客 物流项目第三期(统一网关、工厂模式运用)-CSDN博客 物流项目第四期(运费模板列…...
前端JavaScript-嵌套事件
点击 如果在多层嵌套中,对每层都设置事件监视器,试试看 <!DOCTYPE html> <html lang"cn"> <body><div id"container"><button>点我!</button></div><pre id"output…...

X 下载器 2.1.42 | 国外媒体下载工具 网页视频嗅探下载
X 下载器让你能够轻松地从社交应用如Facebook、Instagram、TikTok等下载视频和图片。通过内置浏览器访问网站,它能自动检测视频和图片,只需点击下载按钮即可完成下载。去除广告,解锁本地会员,享受无广告打扰的下载体验。 大小&am…...

STM32 CAN CANAerospace
STM32的CAN模块对接CANAerospace 刚开始报错如下. 设备开机后整个CAN消息就不发了. USB_CAN调试器报错如下. index time Name ID Type Format Len Data00000001 000.000.000 Event 总线错误 DATA STANDARD 8 接收过程错误-格…...

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取
1 简介 为了有效地利用雾状冰生长的物理现象,最近开发了一种优化算法——雾状优化算法(RIME)。它模拟硬雾状和软雾状过程,构建硬雾状穿刺和软雾状搜索机制。在本研究中,引入了一种增强版本,称为修改的RIME…...

服务器安装xfce桌面环境并通过浏览器操控
最近需要运行某个浏览器的脚本,但是服务器没有桌面环境,无法使用,遂找到了KasmVNC,并配合xfce实现低占用的桌面环境,可以直接使用浏览器进行操作 本文基于雨云——新一代云服务提供商的Debian11服务器操作,…...
Java设计模式之组合模式:从入门到精通(保姆级教程)
文章目录 1. 组合模式概述1.1 专业定义1.2 通俗解释1.3 模式结构2. 组合模式详细解析2.1 模式优缺点2.2 适用场景3. 组合模式实现详解3.1 基础实现3.2 代码解析4. 组合模式进阶应用4.1 透明式 vs 安全式组合模式4.2 组合模式与递归4.3 组合模式与迭代器5. 组合模式在实际开发中…...

Oracle 创建外部表
找别人要一下数据,但是他发来一个 xxx.csv 文件,怎么办? 1、使用视图化工具导入 使用导入工具导入,如 DBeaver,右击要导入的表,选择导入数据。 选择对应的 csv 文件,下一步就行了(如…...

大语言模型 17 - MCP Model Context Protocol 介绍对比分析 基本环境配置
MCP 基本介绍 官方地址: https://modelcontextprotocol.io/introduction “MCP 是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

【软考向】Chapter 9 数据库技术基础
基本概念数据库的三级模式结构 数据模型E-R 模型关系模型各种键完整性约束 关系代数5 种基本的关系代数运算:并、差、笛卡儿积、投影和选择扩展的关系代数运算:交(Intersection)、连接(Join)、除(Division)、广义投影(Generalized Projection)、外连接(O…...

实战:Dify智能体+Java=自动化运营工具!
我们在运营某个圈子的时候,可能每天都要将这个圈子的“热门新闻”发送到朋友圈或聊天群里,但依靠传统的实现手段非常耗时耗力,我们通常要先收集热门新闻,再组装要新闻内容,再根据内容设计海报等。 那怎么才能简化并高…...

STM32单片机GUI系统1 GUI基本内容
目录 一、GUI简介 1、emWin 2、LVGL (Light and Versatile Graphics Library) 3、TouchGFX 4、Qt for Embedded 5、特性对比总结 二、LVGL移植要求 三、优化LVGL运行效果方法 四、LVGL系统文件 一、GUI简介 在嵌入式系统中,emWin、LVGL、TouchGFX 和 Qt 是…...
从零开始学习three.js(21):一文详解three.js中的矩阵Matrix和向量Vector
一、三维世界的数学基石 在Three.js的三维世界里,所有视觉效果的实现都建立在严密的数学基础之上。其中向量(Vector) 和矩阵(Matrix) 是最核心的数学工具,它们就像构建数字宇宙的原子与分子,支…...

应届本科生简历制作指南
一、找一个专业的简历模板 首先,你需要访问 Overleaf 的官方网站,也就是Overleaf, Online LaTeX Editor,进入页面后,点击注册按钮,按照提示填写相关信息来创建一个属于自己的账号,通常需要填写用户名、邮箱…...
VUE3+TS实现图片缩放移动弹窗
完整代码 使用VUE3、TS,实现将图片通过鼠标拖拽缩放以及选择缩放比例。 <template><div><el-dialogv-model"dialogVisible"title"查看图片":close-on-click-modal"false":close-on-press-escape"false"fu…...
大语言模型训练数据格式:Alpaca 和 ShareGPT
在大规模语言模型(LLM)的开发中,训练数据的质量和格式起着至关重要的作用。为了更好地理解和构建高质量的数据集,社区发展出了多种标准化的数据格式。其中,Alpaca 和 ShareGPT 是两种广泛使用的训练数据格式࿰…...
实现动态增QuartzJob,通过自定义注解调用相应方法
:::tip 动态增加Quartz定时任务,通过自定义注解来实现具体的定时任务方法调用。 ::: 相关依赖如下 <!-- 用来动态创建 Quartz 定时任务 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…...

PyTorch可视化工具——使用Visdom进行深度学习可视化
文章目录 前置环境Visdom安装并启动VisdomVisdom图形APIVisdom静态更新API详解通用参数说明使用示例Visdom动态更新API详解1. 使用updateappend参数2. ~~使用vis.updateTrace方法~~3. 完整训练监控示例 Visdom可视化操作散点图plot.scatter()散点图案例线性图vis.line()vis.lin…...
Qt无边框界面添加鼠标事件
在Qt中实现无边框窗口的鼠标事件处理,主要涉及窗口拖动和调整大小功能。以下是分步实现的代码示例: 1. 创建无边框窗口 首先,创建一个继承自QWidget的自定义窗口类,并设置无边框标志: #include <QWidget> #in…...

企业级爬虫进阶开发指南
企业级爬虫进阶开发指南 一、分布式任务调度系统的深度设计 1.1 架构设计原理 图表 1.2 核心代码实现与注释 分布式锁服务 # distributed_lock.py import redis import timeclass DistributedLock:def __init__(self, redis_conn):self.redis = redis_connself.lock_key = …...
Ubuntu ping网络没有问题,但是浏览器无法访问到网络
我这边是尝试清楚DNS缓存然后重新访问就可以了。 使用 resolvectl 刷新 DNS 缓存 在 Ubuntu 20.04 及更高版本中,可以使用以下命令来刷新 DNS 缓存: sudo resolvectl flush-caches 使用 systemd-resolve(适用于旧版本) 如果你…...

网络安全-等级保护(等保) 2-7 GB/T 25058—2019 《信息安全技术 网络安全等级保护实施指南》-2019-08-30发布【现行】
################################################################################ GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》包含安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管理制度、安全管理机构、安全管理人员、安…...