难度中等
2459
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
输入:coins =[1, 2, 5]
, amount =11
输出:3
解释:11 = 5 + 5 + 1
示例 2:
输入:coins =[2]
, amount =3
输出:-1
示例 3:
输入:coins = [1], amount = 0 输出:0
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104
通过次数637,325提交次数1,372,554
/**
* @param {number[]} coins
* @param {number} amount
* @return {number}
*/
var coinChange = function(coins, amount) {
function fun(amount)
{
// 添加备忘录
let count = new Array(coins.length+1);
// 查备忘录
if (count[amount]!=undefined) return count[amount];
//base case
if(amount<0) return -1;
if(amount==0) return 0;
let len = 9999; //统计层数,即最小硬币数
//递归
for(var i=coins.length-1;i>=0;i--)
{
x = fun(amount-coins[i])
if(x==-1) continue;
len = Math.min(len,1+x); //统计层数
}
if(len==9999) count[amount]=-1;
else count[amount]=len;
return count[amount]
}
return fun(amount)
};
/**
* @param {number[]} coins
* @param {number} amount
* @return {number}
*/
var coinChange = function(coins, amount) {
// 迭代方法
// 1.创建dp数组
let dp = new Array(amount+1).fill(Infinity)
//base case
dp[0]=0
for(let i=0;i<=amount;i++)
{
for(let j=0;j<coins.length;j++)
{
if(i>=coins[j])
{
dp[i]=Math.min(dp[i],1+dp[i-coins[j]])
}
}
}
return dp[amount]!=Infinity? dp[amount]:-1;
};