动态规划——零钱兑换(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
}
热门推荐
如何描写广阔无垠的草原:一篇写景技巧指南!
努尔哈赤命理八字分析详解:如何解读清朝开国皇帝的生辰八字
如何利用网格策略进行市场操作
共同犯罪的刑事责任怎样承担
绝壁上的作业!“挂壁人”这个夏天非常忙……
名誉损失如何计算
放疗后老咳嗽怎么办?专家详解原因与应对方法
如何掌握硬拉正确姿势:避免常见错误,提升训练效果
《米塔》:俄罗斯二游黑马,老套路新体验为何能获98%好评?
普洱文旅:以节庆文化做节庆经济促旅游城市建设
货架选购指南:快速选择合适的货架!
小说知识点详解
小灯泡的温度越高它的电阻越大
怎样合法使用新闻媒体的图片
电信保号套餐:低价续命,不浪费手机号
淋巴结肿大的症状和表现
金融交易市场运行的非理性风险特征
宅基地盖房没办用地手续?满足这些条件可以补办
法莫替丁片如何服用
2024年加州大学各分校优势专业推荐!
手机携带的细菌量超乎我们的想象,甚至比马桶盖还脏!
四联疗法期间抽烟有什么影响
低糖甜品推荐,让你甜得健康!
深圳地铁最新规划:2035年将建成33条地铁,总里程1335公里
企业员工培训费怎么做:成本优化与效益提升的策略
亚运村首度揭开面纱 总面积113公顷可容纳近2万人
助理工程师职称评定的学历要求是什么
不同环境下物体密度的变化规律探讨
2025年实用新型专利申请的流程及步骤
停运费保险公司赔付吗?法律这样规定