利用动态规划解 LeetCode 第 322 题:零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
说明:你可以认为每种硬币的数量是无限的。
解答:类似于 0/1 背包问题,即取与不取,有 dp、dfs、bfs 三种解法,这里只列出 dp 的。用 dp 尽量用自底向上的方式去做。
上代码:
/**
* @param {number[]} coins
* @param {number} amount
* @return {number}
*/
var coinChange = function(coins, amount) {
var answer=[0];
for(let i=1;i<=amount;i++){
answer[i]=amount+1;
for(j in coins){
if(i-coins[j]>=0){
answer[i]=answer[i]>(answer[i-coins[j]]+1)?answer[i-coins[j]]+1:answer[i];
}
}
}
return answer[amount]==amount+1?-1:answer[amount]
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论