动态规划——零钱兑换(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
}
热门推荐
哪里能找到自然语言理解的相关论文?
LOL:为何有些英雄大招蓝耗不是100?拳头是怎么设计的?
ERP系统与OA系统集成对接指南:关键步骤与常见误区解析
GPU服务器NVLink与PCIe接口技术分析
如何在Chrome中设置安全浏览模式
【Win】如何在 Windows 11 中隐藏文件和文件夹
芦荟胶的功效与使用指南:晒伤后的必备良品
开国女将军李贞:从童养媳到中国首位女将军的传奇人生
鹦鹉为何五颜六色?
如何解决小爱音箱网络连接问题,轻松应对智能生活挑战,提升生活便捷效率
如何最有效地解决心病
春季能否服用鹿茸?医生的专业解答来了
11.导师是“神仙”?如何找到合适的科研导师?
南京女子监狱:实施“攻心”策略照亮“新生路”
降低肥猪饲料成本的方法有哪些?如何降低猪的饲料成本
如何让法官批准缓刑?刑事案件申请要点全解析
电影《阿金》:许鞍华导演致敬香港武行的力作
炉石传说战绩查询方法
医用雾化器:参数、用法与注意事项大揭秘
地瓜与茶的搭配食用指南:营养与禁忌全方位解析
电脑QQ发送本机文件失败怎么办?多种实用解决方案帮你轻松应对
正在练腹肌的人营养怎样搭配
曾消灭日军3.3万人的抗战名将孙立人,为何被蒋介石软禁33年?
八小时工作制:一个世纪后的中国,为何仍难实现?
星空引路人:李元,以科普之名镌刻天际的传奇
金珍珠和黑珍珠有什么不同
如何预防意外伤害的常识
夏日安全手册 | 防范儿童常见七类意外伤害,必备急救知识
神奇宝贝API:一个全面的神奇宝贝数据接口
做了raid的服务器如何添加硬盘