动态规划——零钱兑换(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
}
热门推荐
茶香入心:各类茶叶的养生功效
科普:如何区分山洪灾害和泥石流灾害
多域协同作战中电子侦察的体系构建与效能提升研究
舌尖上的旅行:探索传统与创新的融合美食
深度剖析垃圾焚烧热解气化炉的工作原理
锌被称“男人的加油站”?多吃4种“高锌菜”,功能强
化学实验下的金属元素化合物性质分析
小麦茎基腐病防控技术方案
如何准确查询车险受益人?这种查询途径有什么特点?
如何准确判断车险第一受益人?这种判断有哪些需要注意的地方?
什么是全文检索?解读结构化数据与非结构化数据
蝶梦翩跹:解析梦境中的美丽隐喻
每个用户都应该知道的 6 个 iPhone 相机技巧
杜鹃花海惊艳“上线”!最新赏花路线来啦!
屈原作品及其深远影响:一生著述,千年传颂
股价尾盘拉升如何影响市场趋势?投资者应如何应对这些市场变化?
梦境与焦虑:快速眼动睡眠如何预测考试压力?
豆粕叒跌了!南美大豆降价抛售,油厂开工率下降,养殖企业或将受益
张雪峰谈动物医学专业就业前景、考研方向、优势与劣势
加沙停火带来希望,人道援助全面提升
如何投诉司法鉴定机构?投诉范围及流程详解
地球环境所等揭示印度季风区干旱与太平洋及大西洋海温遥相关
广州公安:以科技赋能新质战斗力
古代人为什么喜欢留胡须?古人蓄胡须的寓意与讲究
民法主观题背诵口诀:高效记忆与解题技巧
过安检门为什么老是响但是没金属
安全生产责任与员工绩效如何挂钩?
省直部门如何申请内部调动?
小孩子拉肚子原因及护理要点
华法林钠的用途及注意事项