var change = function(amount, coins) {
var dpArray = [];
for(let i=0;i<amount+2;i++){
dpArray[i] = 0;
}
dpArray[0] = 1;
coins.forEach(function(coin){
for (var i = coin; i <= amount; i++) {
// 以i=coin作为起始条件,可以避免重复计算3=1+2=2+1这种情况
dpArray[i] += dpArray[i-coin];
}
});
return dpArray[amount];
};
这道题首先想到的已经不是递归求解了!应该是动态规划~有进步有进步嘿嘿。。。
首先,JavaScript的数组有一个很让人脸蛋疼的特性,就是初始化的时候数组元素全都是undefined,而不是0。因此,我们首先要对所有的数组元素置零,以方便后续的计算。
接下来,动态规划数组的初始条件是,dp[0] = 1,表示,当我们要凑0元的时候,我们只有一种选择,那就是所有的钱币都不选。
接下来,随着我们对数组coins的访问,dp也在不断变化;并且,每访问一个元素,dp[index]的结果就表示,在访问到这个钱币为止的条件下(比如我们访问到了[1,2,5]中的2的时候,就表示我们只用1,2两个面值时的结果),可以凑足index元钱的方法有多少种呢?;这样,当我们访问完了数组所有的元素时,dp[amount]就是我们期望的结果。
下面,是对for循环中:dpArray[i] += dpArray[i-coin];的解释:
这就表示,如果我们想知道凑齐i块钱有多少种途径,那么我们就要去看凑齐i-coin(当前硬币金额)有多少种途径。随着对coin面值的依此访问,我们就可以将所有的结果加起来,得到我们最终所求的凑齐amount元钱的途径数。