硬币找零——动态规划解法

硬币找零问题详解及动态规划解法 动态规划提供了一种高效解决硬币找零问题的方式。通过保存已经计算出的结果,避免了大量重复计算,从而大大提高了算法的效率。这个思路不仅适用于硬币找零问题,还可以扩展到很多类似的最优化问题中。 阅读详情

动态规划和备忘录的比较:
动态规划解法其实和递归备忘录解法很相似,也有点不太相同。

  • 动态规划使用dp数组来记录状态。递归备忘录使用备忘录来记录已经计算过的子问题。
  • 动态规划是自底向上,递归是自顶向下的。

问题的描述:
就是给定一个钱数n,然后给定一个k种硬币
然后输入硬币的面值,然后求出最少的硬币来凑出这个钱数

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

解决代码:

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


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);
	}
	//定义一个dp容器,容量为money+1,值为money+1即极大值 
	vector<int> dp(money+1,money+1); 
	cout << dpsolve(money,coin,dp);
	return 0;
} 

int dpsolve(int n, vector<int> &coin, vector<int> &dp){
	//dp的初始状态,0需要0个硬币 
	dp[0] = 0; 
	//开始填写dp table
	for(int i=1;i<=n;i++){
		for(int j=0;j<coin.size();j++){
			//如果硬币面值大于需要的钱数就跳过 
			if(i-coin[j]<0) continue;
			//得出dp[i]的最优值,即子问题是否有解 
			dp[i] = min(dp[i],dp[i-coin[j]] + 1);
		}
	}
	//说明无解 
	if(dp[n]==n+1) return -1;
	//返回最优解
	return dp[n];
}

感悟:
其实我感觉这种自底向上的动态规划理解起来更容易。不过动态规划题最难的地方就是找出状态转移方程。加油好好练吧💪!

有问题可以评论区问我这个小菜鸡哦!

数据结构与算法——9. 找零问题的递归解法和动态规划解法 文章目录一、分治策略与递归算法1. 分治策略的概念2. 分治策略与递归算法的关系二、优化问题和贪心策略1. 优化问题2. 贪心策略3. 贪心策略失效三、找零问题的递归解法改进递归算法解决方案四、找零问题的动态规划解法1. 动态规划解法2. 动态规划中最主要的思想3. 找零兑换:动态规划算法扩展 一、分治策略与递归算法 1. 分治策略的概念 分治策略是解决问题的典型策略:分而治之。将问题分为若干更小规模的部分通过解决每一个小规模部分问题,并将结果汇总得到原问题的解。 2. 分治策略与递归算法的关系 递归算 阅读详情

相关推荐

硬币找零动态规划C语言实现

一个简单的动态规划算法实例,实现硬币找零的最小硬币数以及每种面额硬币的数量。

动态规划实战--硬币找零问题

实战动态规划,硬币找零问题

德玛西亚 3589

给MATLAB安装runtime插件

输入你刚刚下载压缩包的位置(小白提示:在 此电脑 中找到压缩包位置,右键属性复制位置)(!设置好以后然后填写下面输出exe文件的信息,包括文件的名字、作者、Email、公司、概述、描述,下面还可以选择额外的安装选项,exe文件运行需要的其他文件(图像、子程序等)、提供给用户的文件(readme.txt等)(很多方法是官网下载,但在官网下载还是会版本不对应,所以直接在你所用的MATLAB里搜索安装链接最靠谱)(!5.可以打包程序了(你发送文件的人电脑里没有MATLAB也可以查看运行你的程序了)

Pei_hua100的专栏 1万+

动态规划——硬币找零思路

找零的两种问题 硬币找零问题,有两种。一种用贪心解决,一种用动态规划解决。 问题1:假设我们有 v1,v2,……,vn(单位是元)这些币值的硬币,它们的张数分别是 c1、c2、…, cn。我们现在要用这些钱来找零 w元,最少要用多少张纸币呢? 问题2:假设我们有几种不同币值的硬币 v1,v2,……,vn(单位是元)。如果我们要支付 w 元,求最少需要多少个硬币。比如,我们有 3 种不同的硬币,1 ...

约定的博客 1431

逆向实战:我是如何一步步解开美团外卖App的mtgsig3.0签名(附关键代码片段)

本文详细记录了逆向分析美团外卖App的mtgsig3.0签名算法的全过程,从抓包到算法还原,包括Java层和Native层的深度分析。通过Frida、IDA Pro等工具,揭示了签名生成的多层加密流程,并提供了关键代码片段。文章还探讨了逆向工程中的反调试对抗和签名时效性问题,为安全研究人员提供了宝贵的技术参考。

weixin_42530732的博客 872

ArcGIS | 全球新冠肺炎地图数据下载和处理

ArcGIS

thinkpang的博客 2900

【动态规划法】硬币找零问题

给定 n 种不同面值的硬币,分别记为 c[0], c[1], c[2], … c[n],假设每种硬币的数量是无限的。同时还有一个总金额 k,编写一个动态规划计算出最少需要几枚硬币凑出这个金额 k? 【样例输入】 12 1 2 5 【样例输出】 3 【样例说明】输入第一行为金额总数,第二行为硬币的不同面值;输出为需要的最少硬币数

怪&的个人博客 3394

第二章 零差云控关节模组内部构造

对零差云控的eRob70I进行了拆解

SFY__优快云的博客 5967

动态规划:最少硬币找零问题详解

本文介绍了使用动态规划解决硬币找零问题的方法。给定不同面额的硬币和总金额,目标是找到使用最少硬币的组合。通过建立dp数组记录每个金额的最优解,初始化dp[0]=0,其余为无穷大。递推过程中,对每种金额尝试所有硬币面额,更新最优解。若最终解大于总金额,说明无解返回-1。C#实现展示了具体代码,时间复杂度为O(amount*硬币种数)。文章还提到可扩展输出具体硬币组合或转换为0/1背包问题。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1207

时钟门控ICG单元的timing问题

本文探讨了数字IC设计中门控时钟(ICG)的时序收敛问题,重点分析了ICG单元在setup时序检查中易出现违例的原因及优化方法。文章指出,由于ICG单元不在时钟树平衡范围内,其时钟路径延迟通常小于后续寄存器,导致setup时序难以满足。提出的解决方案包括:1)将ICG尽量靠近受控寄存器放置;2)使用set_clock_gating_check命令加强时序约束;3)在布局阶段设置负时钟延迟;4)CTS阶段设置插入延迟。同时强调set_clock_gating_check命令对ICG单元同样有效,并介绍了ICG

u011075954的专栏 1109

Agent框架系列:1-低代码智能体平台深度解析Dify、Coze、n8n

Dify、Coze 和 n8n 是三大主流低代码智能体平台,各有侧重。Dify 适合企业级 AI 应用,具备强大的 RAG 和知识库管理能力,技术栈为 Python + React。Coze 由字节推出,主打零代码和快速原型开发,集成 60+ 插件,极适合非技术用户。n8n 以工作流自动化和系统集成为核心,支持 400+ 外部应用,基于 Node.js + Vue,扩展性极强。选择建议:非技术团队选 Coze,AI 应用选 Dify,复杂自动化与集成选 n8n。可根据实际需求混合使用,最大化平台优势。

3084

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

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

qq_37756660的博客 2869

用SOLIDWORKS从零画一个履带机器人,手把手教你搞定底盘和传动

本文详细介绍了如何使用SOLIDWORKS从零开始设计履带式机器人,重点讲解底盘结构优化和传动系统设计的关键步骤。通过七个阶段的实战指南,包括前期规划、底盘建模、驱动系统装配、履带生成、动态模拟等,帮助工程师和爱好者掌握履带机器人的核心设计技巧,提升地形适应能力和动力效率。

weixin_30872499的博客 632

硬币找零问题的动态规划解法与实现思考笔记

本文探讨了硬币找零问题的动态规划解法。首先回顾问题背景:给定不同面额硬币和总金额,求凑成金额的最小硬币数。核心解法采用动态规划,定义dp[i]为凑金额i的最小硬币数,通过状态转移方程dp[i] = min(dp[i], dp[i-coin]+1)求解。实现时需注意初始值设为INT_MAX-1避免溢出,并采用完全背包的标准遍历顺序。文章分析了边界条件和优化方向,指出动态规划是通用解法,而贪心算法仅适用于特定面额。最后强调工程实现中性能与可读性的权衡。

2501_90114783的博客 549

自学 ABAP 和自学 SAP 的差别

有朋友在我的 ABAP 学习教程里留言: > 自学SAP是不是都要搭建虚拟服务器,然后自己去官网下载新版本SAP就可以吗 对于初学者,我们要搞清楚 ABAP 和 SAP 的区别。 ABAP 是一门编程语言,SAP 首先是德国软件公司的名称,也代表这家公司开发的一系列软件。SAP 公司开发的软件,我们有时也称产品,其功能能满足客户一个或者多个领域的业务需求。这些不同领域,我们也称为不同的业务模块,比如 ERP,CRM,SRM,HR 等等。

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合

动态规划实现硬币找零 动态规划的思想 动态规划步骤

YangStudent的博客 1686

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

weixin_29216049的博客 638

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

动态规划算法(七):硬币找零问题

本文介绍了动态规划算法在硬币找零问题中的应用。该问题要求使用最少硬币组合特定金额,若无解则返回-1。文章对比了暴力递归法(时间复杂度O(2^n))和动态规划法(时间复杂度O(amount*n))的优劣。通过定义dp数组存储子问题解,动态规划避免了重复计算,显著提升效率。文中提供了Java代码实现,并通过示例分析展示了算法过程。最后指出该方法的变种应用,如组合数问题和限制硬币数量问题。动态规划算法将问题复杂度从指数级降至多项式级,是解决最优化问题的有效方法。

一碗黄焖鸡三碗米饭的博客 1110

leetcode 322零钱兑换 动态规划 Java

题目描述 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 解题思路: dp[i]代表金额i的最优解,即使用最少张数,使用dp[1]~dp[am...

冒个泡儿的博客 698

最少硬币问题c语言_Python面试题之找零问题(动态规划解法)

如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出解,比如1元换成2元的时候)分析思路其实这道题用动态规划很好解。假设对于i = 1…N-1, 需要的最少硬币数为count(i), 那么,对于N,所需的硬币数为min( count(i) + count(N-i)) , i=1...N-1;最直观的方法就是递归。递归会...

weixin_36424625的博客 735

经典例题解读:动态规划解决硬币找零问题

• 如果i >= coin ,即当前金额大于等于当前硬币面额时,dp[i]可以通过使用一枚coin硬币来更新,更新公式为dp[i] = min(dp[i], dp[i - coin] + 1)。例如,有硬币面额[1, 2, 5],目标金额为11,最少需要3枚硬币(5 + 5 + 1),若目标金额为3,最少需要2枚硬币(1 + 2)。例如,在背包问题中,将硬币的面额看作物品的重量,将总金额看作背包的容量,将硬币的数量看作物品的价值,就可以使用类似的动态规划方法来求解。在计算dp数组之前,需要进行初始化。

2501_91651594的博客 538

LeetCode 面试题 08.11. 硬币

a 减 1,则多出 25 分,总面值为 25 + 10b + 5c。由 b、c 重新降序排列,即10b’ + 5c’ = 25 + 10b + 5c,解得 b’ = b + (5 + c) / 2,c’ = (c + 5) % 2。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。因为给定 n 后,d 由 a、b、c 决定,因此仅讨论 a、b、c 之间的关系即可。共计 (b + 1)(b + c +1) 种。给定 a 不动,讨论 b 和 c 的组合数。

zheliku的博客 427

[LeetCode] Coin Change 2 硬币找零之二

You are given coins of different denominations and a total amount of money. Write a function to compute the number of combinations that make up that amount. You may assume that ...

weixin_33972649的博客 164

Coin Change

1. 解析 题目大意,找零钱,给具有一定数额的硬币,求解能找零的最少数量的硬币。 2. 分析 这道题本质上是Partition Equal Subset Sum的升级版。将题目转换一下,就是,给定n个数,求能否可以用这n个数组成所给定的目标数?如果可以,返回使用的最少个数。很明显的一道动态规划题,用dp[i]表示当目标 target = i 时,需要找零所用的最少硬币数量。那么我们就可以...

Czyaun的博客 361

算法:322. Coin Change找零钱

322. Coin Change You are given an integer array coins representing coins of different denominations and an integer amount representing a total amount of money. Return the fewest number of coins that you need to make up that amount. If that amount of money

AI架构师易筋 640
上一篇: 硬币找零——递归备忘录解法
下一篇: c++队列的基本使用
unomit
博客等级 码龄7年 30粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值