一 题目
二 代码
//动态规划
let coinChange=function(coins,amount){
//dp中每一项记录amount=i时,需要的硬币个数为dp[i]
let dp=new Array(amount+1);
//初始化dp的每一项为amount+1
for(let i=0;i<dp.length;i++){
dp[i]=amount+1;
}
dp[0]=0;
//寻找amount从0到11时,对应的需要最小硬币个数
for(let i=1;i<=amount;i++){
//遍历零钱数组
for(let coin in coins){
//总金额小于硬币面值,则进入下一次循环
if(i-coins[coin]<0) continue;
//总金额大于或等于硬币面值
//这里就能解释为什么dp[i]要初始化为amount+1。
// 因为这里要比较得到较小的硬币个数胡,因此初始化时应该给dp[i]赋值为"无穷大"
//dp[i]的最大值为amount,即用amount个面值为1的硬币组成
dp[i]=Math.min(dp[i],dp[i-coins[coin]]+1);
}
}
//dp[amount]===amount说明没有没有任何一种硬币组合能组成总金额,则返回1
return dp[amount]===amount+1?-1:dp[amount];
}