凑零钱动态规划java_动态规划巧解凑零钱问题 | 创作者训练营

动态规划是运筹学中求最优解的常用手段,解决此类问题的难点在于准确归纳出状态转移方程

状态转移方程,最重要的是先找到状态,然后将「大问题」转换成「小问题」,将「全局问题」转换成「局部问题」。转换的过程用表达式写出来,即是状态转移方程。

我们通常使用 DP (Dynamic Programming)表示状态转移方程。

题目

18579bef2b3796d4b0b9db250d715b01.png

分析

题目要求凑出给定金额最少的硬币数,这是个唯一的状态。每次选择不同面额的硬币会影响这个状态的变化。

我们使用 dp(n) 表示凑出 n 元,最少所需的硬币个数。此时可以归纳出一个状态:dp(n) = dp(n-coin) + 1复制代码

凑出 n 元最少所需要的硬币数,等于凑出(n-coin) 元最少所需的硬币数目,加上最后的 coin 这一枚。

边界条件有两个:dp(0) = 0 // 凑出 0 元,不需要硬币

dp(n < 0) = -1 // 金额小于 0,直接返回 -1

其中,我们使用一个 map 储存已经计算过金额的最优解,防止重复计算。

实现const coinChange = (coins, amount) => {  let map = {};

function dp(amount){if(amount == 0) return 0;if(amount  -1) {// 更新 count count = Math.min(count, sub+1)

}

}

map[amount] = count;// 不可以直接返回 count,因为存在硬币都匹配不到情况的,此时我们要// 将默认的 count 改成 -1 返回// return countreturn count == Number.MAX_SAFE_INTEGER ? -1 : count;

}

return dp(amount);

}复制代码

「 一枚前端学习小透明,努力学习前端知识,同时分享自己对生活的一些思考,欢迎一起讨论交流。如果我的文章对你有帮助,请点个赞,会非常感恩你的鼓励。完」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值