动态规划——零钱兑换(Leetcode 322)
创作时间:
作者:
@小白创作中心
动态规划——零钱兑换(Leetcode 322)
引用
CSDN
1.
https://m.blog.csdn.net/2401_85117868/article/details/139912163
想必大家看一眼就明白了(bushi),这就是动态规划的背包问题~
算法思想
那么,既然知道了这是个动态规划问题,就要思考如何列出正确的状态转移方程?
1、确定 base case,这个很简单,显然目标金额
amount
为 0 时算法返回 0,因为不需要任何硬币就已经凑出目标金额了。
2、确定「状态」,也就是原问题和子问题中会变化的变量。由于硬币数量无限,硬币的面额也是题目给定的,只有目标金额会不断地向 base case 靠近,所以唯一的「状态」就是目标金额
amount
。
3、确定「选择」,也就是导致「状态」产生变化的行为。目标金额为什么变化呢,因为你在选择硬币,你每选择一枚硬币,就相当于减少了目标金额。所以说所有硬币的面额,就是你的「选择」。
4、明确
dp
函数/数组的定义。我们这里讲的是自顶向下的解法,所以会有一个递归的
dp
函数,一般来说函数的参数就是状态转移中会变化的量,也就是上面说到的「状态」;函数的返回值就是题目要求我们计算的量。就本题来说,状态只有一个,即「目标金额」,题目要求我们计算凑出目标金额所需的最少硬币数量。所以我们可以这样定义
dp
函数:
dp(n)
的定义:输入一个目标金额
n
,返回凑出目标金额
n
的最少硬币数量。
搞清楚上面这几个关键点,解法的伪码就可以写出来了:
// 伪码框架
int coinChange(int[] coins, int amount) {
// 题目要求的最终结果是 dp(amount)
return dp(coins, amount)
}
// 定义:要凑出金额 n,至少要 dp(coins, n) 个硬币
int dp(int[] coins, int n) {
// 做选择,选择需要硬币最少的那个结果
for (int coin : coins) {
res = min(res, 1 + dp(n - coin))
}
return res
}
热门推荐
吸附性义齿详细过程教程揭秘,包括初诊/取模型/边缘修整/牙颌位关系的确定等
单颗吸附义齿怎么做?术前评估/取模与托盘制作/制作过程及原理一览
五档即时成交剩余撤销到底是什么意思?
跌倒风险评估与防范
数学生物学中的混沌系统:以罗伯特·梅模型为例
《贺新郎》辛弃疾原文及赏析
如何从网页源码提取视频
预防耳石症的方法
郑经:气死父亲,私通乳母,却守20年大义!
武术流派之昆仑派
安徽省工商业用户电价分析报告
目标设定与行动管理课件
了解新车中的 GPS 跟踪器:优点、隐私问题以及如何检测它们
怎样找出车内被偷装的GPS定位器?有不同的方法
怎样投诉旅行社最有效?
警惕“能者多劳”成为话语陷阱
二战日本全民皆兵:揭秘日本战争背后的真相
蒌蒿满地芦芽短,正是河豚欲上时:蒌蒿、芦芽、野鸭、河豚都可以吃吗?
如何提升家居空间的利用率?这种利用率在不同户型中的实现方式有何不同?
“禁”还是“用”?高校AI使用现状调查
王朝1982献唱《哪吒之魔童闹海》片尾态度曲《我乃哪吒三太子》,燃爆国漫新声
马斯克的中国情结:特斯拉与全球最大电动车市场的共生共赢
构建 LLM 应用程序时经常遇到的高级概念的快速指南
老年人如何科学饮食?手把手教你做好一日三餐(内含食谱),快收藏!
山楂和大枣能一起泡水喝吗
鞋码中的CN是什么意思?一文详解CN码转换与测量指南
玻璃体混浊与飞蚊症有关系吗
维生素的分类及特点
Telegram注册全攻略:从零风险开户到防封号实战技巧
合同里的标的是指什么意思