面试题 08.11. 硬币
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)
示例1:
输入: n = 5
输出:2
解释: 有两种方式可以凑成总金额:
5=5
5=1+1+1+1+1
示例2:
输入: n = 10
输出:4
解释: 有四种方式可以凑成总金额:
10=10
10=5+5
10=5+1+1+1+1+1
10=1+1+1+1+1+1+1+1+1+1
思路:dp[i]表示凑成i所需要的方案数。
class Solution {
public int waysToChange(int n) {
final int mod = 1000000007;
int[] coins = new int[]{25,10,5,1};
long[] f = new long[n+1]; //组成金额n的方式
f[0] = 1;
// for(int i = 1;i <=n;i++){ //错误的方法,这个重复计算了 1,5 5,1是相同的组合
// f[i] = 0;
// for(int j = 0;j < coins.length;j++){
// if(i-coins[j]>=0)
// f[i] = (f[i]+f[i-coins[j]])%mod;
// }
// System.out.print(f[i]+" ");
// }
for(int i = 0;i < coins.length;i++){ //先考虑加入1的所有组合,在考虑加入2。。。
for(int j = 1;j <= n;j++){
if(j-coins[i] < 0) continue;
f[j] = (f[j]+f[j-coins[i]])%mod;
}
}
// System.out.println(f[n]);
return (int)(f[n]%mod);
}
}