来自面向大象编程,作者nettee。
限制面额从大到小。
public int change(int amount, int[] coins){
int m = coins.length; // 硬币种类
int[][] dp = new int[m+1][amount+1];
for (int i=0;i<=m;i++) {
for (int k=0;k<=amount;k++) {
// base case:
if (k==0) {
dp[i][k] = 1;
}else if (i==0) {
dp[i][k] = 0;
}else {
// 递推关系
dp[i][k] = dp[i-1][k]; // 不拿ci,硬币种类变少
if (k>=coins[i-1]) {
dp[i][k] += dp[i][k-coins[i-1]]; // 继续拿ci(前提是当前需要拿的amount>硬币面额)
}
}
}
}
return dp[m][amount];
}