法1:动态规划
看了题解
想法:
- 数组dp,保存背包容量为0到amount时,用硬币装满背包的方式数
- 动态规划关注于当下;思考:对于当前面额硬币装或者不装?(是否能装下?是否应该装?)
- 对于数组dp从前往后更新,可实现同一面额硬币多次装入
/**
* @param {number} amount
* @param {number[]} coins
* @return {number}
*/
var change = function(amount, coins) {
if(amount == 0) { // amount为0,返回1
return 1;
}
if(coins.length == 0) { // amount不为0,而且没有硬币
return 0;
}
// 思考:对于当前面额硬币装或者不装?
// 从前往后更新,可实现同一面额硬币多次装入
var i = 0, j = 0, dp = [];
for(i = 0; i <= amount; i++) { // 初始化
dp[i] = 0;
}
dp[0] = 1;
for(j = 0; j < coins.length; j++) { // 对于每一面额硬币
for(i = coins[j]; i <= amount; i++) { // 对于能装下该面额硬币的背包
dp[i] += dp[i - coins[j]];
}
}
return dp[amount];
};