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

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

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

  • 动态规划使用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

【Get深一度】小波分析概念1——紧支撑集是什么意思,通俗解释

最近学到小波,在仿真中也用到了紧支撑函数;紧支撑性越好,说明能量越集中;用最通俗的话来讲,紧支撑是这样的: 对于函数f(x),如果自变量x在 0附近的取值范围内,f(x)能取到 C; 而在此之外,f(x)取值为 0; 那么这个函数f(x)就是紧支

Trey_优快云 的优快云博客 8348

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

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

约定的博客 1431

CANoe基础讲解01:从零开始使用CANoe轻松搭建你的第一个CAN网络

本文是一篇CANoe软件入门实操指南,逐步演示了如何从零创建并运行一个CAN FD仿真工程。内容包括:启动软件、配置硬件通道与网络、加载DBC数据库、使用CAPL编写仿真节点发送CAN报文,最终启动测量并在Trace窗口中查看通信结果。通过七个清晰步骤,帮助初学者快速掌握CANoe基本操作,完成首个可运行的仿真网络搭建

车载网络小D的博客 1573

开关电源EMC整改实录:用WSX系列共模电感搞定30MHz辐射超标

本文详细介绍了开关电源EMC整改实战,通过WSX系列共模电感成功解决30MHz频段辐射超标问题。文章分析了共模干扰的产生机制,对比了不同磁芯材料的性能差异,并提供了电路布局优化与安装技巧,最终通过实测数据验证了整改方案的有效性。

weixin_29305313的博客 415

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

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

怪&的个人博客 3394

EDA环境下的LSF进阶调优:如何为Cadence/VCS等工具正确配置cgroups与daemon starter

本文深入探讨了在EDA环境中如何为Cadence/VCS等工具正确配置LSF的cgroups与daemon starter,解决资源分配与特殊应用兼容性问题。通过详细解析cgroups技术、daemon starter配置及混合资源管理策略,帮助提升LSF集群的效率和稳定性,特别适用于高性能计算和芯片设计场景。

weixin_33724046的博客 461

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

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

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

华硕ROG玩家国度安装Ubuntu双系统避坑指南:安全启动密钥那些事儿

本文详细解析了在华硕ROG玩家国度设备上安装Ubuntu双系统时,如何正确处理BIOS中的安全启动(Secure Boot)与密钥管理,避免常见的引导失败和Windows系统无法启动问题。指南提供了从数据备份、启动盘制作到BIOS精细设置(如将OS Type改为Other OS而非简单关闭Secure Boot)以及分区规划的完整流程,确保两个系统都能稳定共存。

weixin_29219189的博客 754

模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

整理的算法模板合集: ACM模板 目录一、树的直径树形DP两次DFS / BFS(找到直径的两个端点)二、动态修改树的边权并求每个时刻的直径(线段树)三、树的重心 一、树的直径 树的直径满足如下性质: 若有多条直径,则所有的直径之间皆有公共点。 直径的两端一定是叶子。 树中距离某一直径端点最远的点,至少有一个是该直径的另一个端点。 对于树上任意一个点,与之距离最远的一个点,至少有一个直径的端点。 给你一个无权无向的树。编写程序以输出该树中最长路径(从一个节点到另一个节点)的长度。在这

繁凡さん的博客 1676

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

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

qq_37756660的博客 2869

TypeScript领域建模实战:基于斯坦福本体论七步法构建健壮数据模型

在软件工程中,领域建模是连接业务需求与技术实现的关键桥梁,其核心在于对业务概念、属性及其关系的显式定义与规范。通过系统化的建模方法,开发者能够将模糊的领域知识转化为清晰、可扩展且类型安全的数据结构,从而在编译时捕获潜在错误,提升代码质量与可维护性。这一过程的技术价值在于实现了从业务逻辑到类型系统的无损映射,确保了设计的一致性。在实践中,结合TypeScript的静态类型检查与Zod的运行时验证,可以构建起从概念到代码再到数据库的三层一致性约束。本文以电商、博客等常见应用场景为例,深入解析如何运用源自斯坦福知

weixin_42551967的博客 383

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

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

2501_90114783的博客 549

AI应用架构师:用RAG解决大模型“幻觉”问题的客服架构设计

在当今的智能客服领域,大语言模型(LLM)凭借流畅的对话能力和强大的理解能力,逐渐取代传统规则式机器人,成为客服系统的核心。但随之而来的“幻觉”问题(即模型编造不存在的信息)却成了致命伤:比如客户问“你们的产品保修期多久”,AI客服可能会自信地回答“3年”,而实际保修期只有1年——这种错误不仅会误导客户,还可能引发投诉、退货甚至法律风险。

AI天才研究院 915

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

YangStudent的博客 1686

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

weixin_29216049的博客 638

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

本文介绍了动态规划算法在硬币找零问题中的应用。该问题要求使用最少硬币组合特定金额,若无解则返回-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、付费专栏及课程。

余额充值