硬币找零——递归备忘录解法

递归算法之10硬币组合一角8分 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言一、pandas是什么?二、使用步骤1.引入 阅读详情

问题很常见吧!就是给定一个钱数n,然后给定一个k种硬币
然后输入硬币的面值,然后求出最少的硬币来凑出这个钱数

例如:11块
有三种硬币 1 2 5
那么最少数就是 3(两个5和一个1)

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
int dp(int n,vector<int> &coin,vector<int> &memo);

int main(){
	int money;
	cin >> money;
	//硬币的种类
	int k;
	cin >> k;
	//定义一个k大小的coin容器,存储硬币的面值
	vector<int> coin;
	for(int i=0;i<k;i++){
		int x;
		cin >> x;
		coin.push_back(x);
	}
	//定义一个备忘录 ,初始化大小为钱数+1,初始值为0代表没有存储数据 
	vector<int> memo(money+1,0);  //易错点memo的大小不要越界 
	
	cout << dp(money,coin,memo);
	return 0;
} 

int dp(int n,vector<int> &coin,vector<int> &memo){
	//当n为0的时候需要0个硬币 
	if(n==0) return 0;
	//当n小于0此时无解
	if(n<0) return -1;
	//!!!注意这里很重要,我们要非常注意这个访问备忘录要确认n一定要大于零,不然会访问越界失败。
	if(memo[n]!=0) return memo[n];
	//定义最优解的值为无限大
	int ans = 10000000;
	//求解当前钱数需要硬币的最小数
	for(int i=0;i<coin.size();i++){
		//每次用一种硬币去试,也就是子问题
		int subproblem;
		subproblem = dp(n-coin[i],coin,memo);
		// 此时子问题无解,跳过
		if(subproblem == -1) continue;
		ans = min(ans,subproblem+1);
	}
	// 把最优解存入备忘录
	memo[n] = ans;
	return memo[n];
}

这里有两点需要注意的:(也是笔者犯错的两个地方):

  • 一个就是我们设置备忘录的时候大小要确定好,比如这里我们的备忘录大小需要是n+1,不然我们访问memp[n]的时候就会越界导致错误
  • 另外一个就是,我们的子问题访问备忘录的时候一定要确定n>0,不然也会越界。也就是把访问备忘录放在两个边界情况后。这里如果我们memo设置为0的话不会出错但是如果题目需要设置为其他值的话就会导致越界。

不太能理解的话,就画出递归树,递归问题画图更容易帮助我们理解。

不懂的话可以评论区问我这个小菜鸡

动态规划(一)硬币找零,机器人路径 动态规划(Dynamic Programming,简称DP),虽然抽象后进行求解的思路并不复杂,但具体的形式千差万别,找出问题的子结构以及通过子结构重新构造最优解的过程很难统一,并不像回溯法具有解决绝大多数问题的银弹。 动态规划求解的一般思路 1.硬币找零   扩展1:单路取苹果   扩展2:机器人路径 2.字符串相似度/编辑距离(edit distance)   应用1:子串匹配 ... 阅读详情

相关推荐

硬币表示-递归

硬币表示 有硬币面额{1,5,10,25},输入一个数值n,要求使用硬币构成数值n,请问有多少种构造方法? import java.util.Scanner; public class Coins { public static int [] coins = new int []{1,5,10,25} ; public static int countWays(int n, int current){ int res = 0 ; if(current ==

nuist_NJUPT的博客 410

【算法】【递归与动态规划模块】换钱的最小硬币数

换钱的最小硬币数

qq_39760347的博客 753

基于stm32开发的红外循迹小车

2.L298N电机驱动模块:分别是5V,12V,GND,可以通过外加电源给驱动模块供电,IN1,IN2,IN3,IN4,EN1,EN2,通过给IN口不同的电平,可以达到控制电机正反转,EN口为使能口,可以通过给EN口不同的PWM波,来达到控制小车速度,1.红外循迹模块:检测黑线的原理是向外发射红外线,当没有遇到黑线的时候,返回回来,之后返回高电平,当遇到黑线的时候,红外被吸收,返回高电平,读取相应IO口的电平就可以知道小车此时的大致位置;模块有四个输入接口,分别连接四个TT马达,驱动小车运动;

2301_81374681的博客 1万+

硬币表示(循环递归)

循环递归,每次选择若干个可以支配的硬币,然后交接给下个硬币重复

月巴虫丰博客 1427

PySide6多线程避坑大全:信号槽崩溃、内存泄漏,这些雷我都帮你踩过了

本文深入探讨了PySide6多线程开发中的常见问题与解决方案,包括信号槽崩溃、内存泄漏等典型陷阱。通过实战案例和优化策略,帮助开发者避免UI线程操作错误、有效管理资源生命周期,并提升跨线程通信的可靠性。特别针对PySide6多线程特性,提供了线程安全日志、死锁检测等实用调试技巧。

weixin_32288959的博客 396

RK3588设备树调试实战:解决NPU不加载、USB3.0识别异常与DP显示问题

本文深入探讨了RK3588设备树调试中的三大典型问题:NPU不加载、USB3.0识别异常与DP显示问题。通过详细的问题定位步骤、关键设备树修改和调试技巧,帮助开发者快速解决硬件适配中的挑战,提升RK3588平台的开发效率。

weixin_30576827的博客 477

数据结构与算法系列(3)————递归解法(找零问题)

递归解法 def recDC(coinValueList, change, knownResults): minCoins = change if change in coinValueList: knownResults[change] = 1 return 1, knownResults elif knownResults[change] > 0: return knownResults[change], knownResul

leetteel 411

DESeq2实战:利用LRT检验解析时间序列基因表达动态变化

本文详细介绍了如何使用DESeq2中的LRT检验分析时间序列基因表达数据,揭示基因表达动态变化模式。通过构建完整模型与简化模型比较,LRT检验能有效识别处理效应随时间变化的基因,适用于发育过程、疾病进展等研究。文章提供了从数据准备、模型构建到结果可视化的完整实战指南,并分享了高级技巧与常见问题排查方法。

weixin_29062671的博客 439

04 | 动态规划:完美解决硬币找零

这是我第一次在课程中提出最优子结构这一概念,所以咱们先了解一下。这东西乍一听有些玄乎,什么叫子问题之间必须相互独立?举一个简单的例子,你就明白了。比如说,假设你在外卖平台购买 5 斤苹果和 3 斤香蕉。由于促销的缘故,这两种水果都有一个互相独立的促销价。如果原问题是让你以最低的价格购买这些水果,你该怎么买?显然,由于这两种水果的促销价格相互独立、互不影响,你只需直接购买就能享受到最低折扣的价格。现在我们得到了正确的结果:最低价格就是直接购买这两种折扣水果。

qq_37756660的博客 2869

DP83848以太网PHY芯片:自动协商与MII/RMII接口实战解析

以太网物理层(PHY)芯片是嵌入式网络通信的核心,负责数字信号与模拟信号的转换,其稳定性和兼容性直接影响系统性能。其工作原理基于IEEE标准,通过管理接口(MDC/MDIO)配置内部寄存器,实现链路速率、双工模式等关键参数的设定。这项技术的核心价值在于为工业控制、汽车电子等严苛环境提供可靠、自适应的网络连接。在实际应用中,PHY芯片通过自动协商(Auto-Negotiation)功能与对端设备智能匹配最佳通信模式,极大提升了产品的易用性。同时,其支持的MII与RMII接口为硬件设计提供了灵活性,前者是标准并

weixin_29189987的博客 374

【Zephyr存储专题】06_存储块设备驱动开发(Nand Flash)

本文介绍了基于Zephyr系统的NAND Flash驱动实现方案,重点阐述了Flash驱动模型的核心架构和关键API设计。

zero的博客 1802

算法学习笔记(一)动态规划问题之凑零钱

目录一、动态规划问题练习题目二、暴力递归三、带备忘录的递归四、dp 数组的迭代解法 一、动态规划问题练习题目 题目:给你 k 种面值的硬币,⾯值分别为 c1, c2 … ck ,每种硬 币的数量无限,再给一个总金额 amount ,问你最少需要多少枚硬币凑出这个 金额,如果不可能凑出,算法返回 -1 。算法的函数签名如下: int coinChange(int[] coins, int amount); 二、暴力递归 步骤: 判定是否符合动态规划问题 子问题是否相互独立(子问题之间无相互影响); 符合

小战神的博客 528

ABAP 里的 XML 与 JSON 处理,一套从接口落地到 Clean Core 的完整参考

ABAP 里的 XML 和 JSON 处理并不只是几段工具类调用。iXML、sXML、、XCO、、code page conversion、GZIP、对象序列化,这些能力背后对应的是不同的数据规模、访问模式、接口契约和运行时边界。小报文、复杂树结构、需要修改节点,iXML 很顺手。大报文、顺序读写、内存敏感,sXML 更可靠。ABAP 结构和 XML、JSON 之间要做标准转换,是主干。现代 JSON API、ABAP Cloud、命名转换,XCO 值得优先考虑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 224

leetcode——322-CoinChange

题目:给你 k 种面值的硬币,面值分别为 c1, c2 ... ck,再给一个总金额 n,问你最少需要几枚硬币凑出这个金额,如果不可能凑出,则回答 -1 。 比如说,k = 3,面值分别为 1,2,5,总金额 n = 11,那么最少需要 3 枚硬币,即 11 = 5 + 5 + 1 。 按照递归暴力解法->带备忘录的递归解法->非递归的动态规划解法的流程走一下子: 1.暴力递...

七月听雪的博客 306

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 904

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

使用动态规划完美解决硬币找零问题(Python)

使用动态规划解决硬币找零问题前情提要动态规划的问题描述重叠子问题无后效性最优子结构互相独立——满足最优子结构互相干扰——不满足最优子结构深入理解最优子结构使用动态规划求解硬币找零问题递归与动态规划状态缓存与循环通用的动态规划从贪心算法到动态规划总结与升华 前情提要 在前面几篇文章中,我们使用了贪心算法求解硬币找零的问题,并从中发现了贪心算法本身的局限性: 贪心算法几乎只考虑了局部最优,因此无法应对需要考虑整体最优的算法问题。 针对这一问题,我们重新思考了解决方案,用递归的方法来穷举出所有可能的组合,从这

zbp_12138的博客 8186

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

leetcode 322. 零钱兑换

题目描述 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 示例 1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 示例 2: 输入:coins = [2], amount = 3 输出:-1 示例 3: 输入:coins = [1], amount = 0 输出:0 示例 4

想握住此生辽阔 229

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【动态规划】换零钱问题

题目:给你k种面值的硬币,面值分别为c1, c2 ... ck,每种硬币的数量无限,再给一个总金额amount,问你最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1 。

qq_41427793的博客 721

LeetCode 322:零钱兑换

题目: 动态规划是求最值,核心是穷举;动态规划框架: ⾸先,这个问题是动态规划问题,因为它具有**「最优子结构」的。要符合「最优⼦结构」,⼦问题间必须互相独立**。举例: ⽐如说,假设你考试,每⻔科⽬的成绩都是互相独⽴的。你的原问题是考出最⾼的总成绩,那么你的⼦问题 就是要把语⽂考到最⾼,数学考到最⾼…… 为了每⻔课考到最⾼,你要把每⻔课相应的选择题分数拿到最 ⾼,填空题分数拿到最⾼…… 当然,最终就是你每⻔课都是满分,这就是最⾼的总成绩。 得到了正确的结果:最⾼的总成绩就是总分。因为这个过程符合最优⼦结构

机械工程跑路哥 422

322. 零钱兑换(Java、动态规划)

动态规划入门基础 最优子结构 三种方法不断优化 class Solution { int[] memo; public int coinChange(int[] coins, int amount) { //备忘录 // memo = new int[amount+1]; // Arrays.fill(memo,-666); //3、dp数组迭代 //dp数组 int[] dp

低调的骏马 706

数据结构与算法(C++)– 动态规划(Dynamic Programming)

动态规划(Dynamic Programming) 理解动态规划的好文:https://www.sohu.com/a/153858619_466939 1、基础 定义:任何递推公式都可以直接转换为递归算法,但是递归算法经常会有一些重复的计算,导致程序效率低。动态规划就是解决这个问题的方法。 动态规划的组成部分: 最优子结构:分解问题 边界:递归的终止条件 状态转移方程:递归的方...

Wang_Jiankun的博客 763

面试必刷:硬币找零问题的5种解法对比(暴力递归→动态规划)

本文系统解析了面试经典算法题——硬币找零问题,从最直观的暴力递归解法入手,逐步优化至记忆化搜索和动态规划,并深入探讨了状态转移方程、复杂度分析及常见变种。文章旨在帮助读者不仅掌握动态规划的标准解法,更能理解其背后的优化思路与面试实战策略。

weixin_29216049的博客 638

leetcode动态规划问题:找零钱最少硬币数

leetcode动态规划问题:找零钱最少硬币数 下面通过对斐波那契数列和这道凑零钱问题详解动态规划。如果只想看本题的答案,请直接翻到最后查看。 问题描述: 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount ...

sww_ang的博客 2452

python找零钱_硬币找零问题几种不同的实现方式(使用Python实现)

问题描述??假设你为一家自动售货机厂家编程序,自动售货机要每次找给顾客最少数量硬币;假设某次顾客投进$1纸币,买了?37的东西,要找?63,那么最少数量就是:2个quarter(?25)、1个dime(?10)和3个penny(?1),一共6个.??分别使用贪心算法,递归,以及递归的优化版本:递归 + 备忘录技术,与动态规划四种解法?? 问题抽象: coin_list = [1,10,25,100...

weixin_39846898的博客 1617

硬币找零问题-详解动态规划

问题引入 动态规划特点 递归解法 存在的问题: 动态规划步骤 第一步:确定状态 第二步:确定转移方程 第三步:确定初始条件和边界条件 第四步:确定计算顺序 原则:当要计算等式左边F(X)是,右边的应该都已经计算出来了 小结 ...

weixin_43892514的博客 1887

03 | 备忘录:如何避免递归中的重复计算?

斐波那契数列没有求最值的问题,因此严格来说它不是最优解问题,当然也就不是动态规划问题。但它能帮助你理解什么是重叠子问题。首先,它的数学形式即递归表达是这样的:return 0;// 如果输入n有误,则返回默认值这个代码有问题吗?没问题,但是它效率极低。那么它效率低在哪里呢?假设上面的函数调用输入是 10,把递归树画出来:我们要怎么理解这个递归树呢?

qq_37756660的博客 1417
上一篇: 斐波那契数列——递归备忘录解法(简单理解)
下一篇: 硬币找零——动态规划解法
unomit
博客等级 码龄7年 30粉丝 110原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值