思路
dp(n): 凑出n元至少需要dp(n)枚硬币
状态转移方程:dp(n) = min(dp(n-1)+1, dp(n-2)+1, dp(n-5)+1) (假如零钱面额为1、2、5)
dp(0) = 0
代码
var coinChange = function(coins, amount) {
let dp = new Array(amount+1).fill(amount+1);
dp[0] = 0;
for(let i=1; i<dp.length; i++){
let min = amount + 1;
for(let j=0; j<coins.length; j++){
if(i-coins[j]<0) continue;
min = Math.min(min, dp[i-coins[j]] + 1);
}
dp[i] = min;
}
return (dp[amount]==amount+1) ? -1:dp[amount];
Number.
};
思路
dp[i][j]: 用前i个硬币凑j元有dp[i][j]种方式, 求解dp[coins.length][amount]
if 不使用第i枚硬币, dp[i][j] = dp[i-1][j]
.....使用第i枚硬币: dp[i][j] = dp[i][j-coins[i-1]], 要判断j-coins[i-1]>=0是否成立, 不成立说明不能使用第i枚硬币
dp[0][j] = 0, dp[i][0] = 1
代码
var change = function(amount, coins) {
let n = coins.length;
let dp = new Array(n+1);
for(let i=0; i<n+1; i++){
dp[i] = new Array(amount+1).fill(0);
dp[i][0] = 1;
}
for(let i=1; i<n+1; i++){
for(let j=1; j<amount+1; j++){
if(j-coins[i-1]>=0){
dp[i][j] = dp[i-1][j] + dp[i][j-coins[i-1]];
}else{
dp[i][j] = dp[i-1][j]
}
}
}
return dp[n][amount];
};