动态规划——零钱兑换(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
}
热门推荐
醋姜的做法最正宗的做法(做醋泡姜时,别急着装罐腌制!)
功能与美学的平衡:实用性与审美并重的设计策略
如何从 CMD(命令提示符)查找您的 IP 地址
玩游戏耳机怎么选?5个要点要记住!
玩游戏耳机怎么选?5个要点要记住!
寻味哈尔滨,中国的第一桶啤酒从何处来?
60-70岁尿酸最新标准:高尿酸血症的预防与控制
苹果煮水的功效与作用及禁忌
中美生活成本大对比:美国中产真的比中国富吗?
汽车知识:自动变速器AT工作原理详解
自动挡档位的正确挂法是怎样的?如何避免挂错档位?
怎么查询国外商标注册信息(查询国际商标注册
什么是APN?如何配置?
生榨米粉、双皮奶、蟹黄汤包……这些传统美食背后有什么讲究?
芹菜肉馅包子怎么调馅好吃
头上出现白斑的原因及治疗方法
手臂细小怎么增肌变粗
《新加坡米其林指南2024》Meta升级米其林二星 莆田落榜
服用抗生素时的注意事项:这些食物千万不能吃
如何选择合适的占卜工具?塔罗牌、卜卦与紫微斗数大解析!
特稿|且以诗意共远方 泰安文旅何以借势腾飞?
Web打卡程序
如何在招聘过程中吸引和留住优质候选人?
宽带迁移收费标准:你必须知道的那些事儿,别被坑啦!
如何快速背下英语笔记:19种实用记忆方法
原来,文学大家都喜欢用笔名
医疗费用票据是什么?纸质版和电子版有何区别?
医院收费流程化管控中哪些环节最容易出问题
“舌尖上的守护”:消化道出血患者康复期间的“干渴”挑战
检查腰部拍什么片子