题
思
参考了这篇题解
我真是个菜逼。
转移方程dp[i][j] = dp[i-1][j] + dp[i][i-coin[i]]
;
dp[i][j]
表示用前i种硬币表示数额j的所有方案数;
所以举个例子:
用四种币值表示100的所有方案数=用三种币值表示100+用四种币值表示75.
因为75的表示中是包含了50的表示的,50的表示中包含了25的表示,所以这个方程是成立的。
只要我们币值顺序算,那么二维数组是可以化简成一位数组的(因为币值小的先算,数额小的也先算)。
代码
class Solution {
public int waysToChange(int n) {
int[] dp = new int[n + 1];
int[] coins = { 1, 5, 10, 25 };
dp[0] = 1;
for (int coin : coins) {
for (int i = coin; i <= n; i++) {
dp[i] = (dp[i] + dp[i - coin]) % 1000000007;
}
}
return dp[n];
}
}