这道题卡了一天。要想AC非常难。
1,第一个解决办法,优化暴力:

public class Coins {
public static int countWays(int n){
int num25 = n / 25;
long res = 0;
for(int i = 0; i <= num25;i++){
int leave25 = n - i * 25;
int num10 = leave25 / 10;
for(int j = 0; j <= num10; j++){
int leave10 = leave25 - j * 10;
int num5 = leave10 / 5;
res += num5 + 1;
res = res % 1000000007;
}
}
return (int) res;
}
}
2,第二个解决办法,递推式:
但是LTE。
dp[i][sum] = 用前i种硬币构成sum 的所有组合数。
http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html

public static int myCountWays(int n){
int[][] dp = new int[5][n+1];
int[] coins = {1,5,10,25};
for(int i = 0; i <= 4; i++){
dp[i][0] = 1;
}
for (int i = 1; i <= 4; ++i)
{
for (int j = 1; j <= n; ++j)
{
dp[i][j] = 0;
for (int k = 0; k <= j / coins[i-1]; ++k)
{
dp[i][j] += dp[i-1][j - k * coins[i-1]];
}
}
}
return dp[4][n];
}
3,最好的答案:

public static int countWays(int n) {
// write code here
int[] coins={1,5,10,25};
int[] dp = new int[100001];
dp[0] = 1;
for(int i = 0;i < 4;++i){
for(int j = coins[i];j <= n;++j){
dp[j] =(dp[j]+dp[j-coins[i]])%1000000007;
}
}
return dp[n];
}
目前的理解是:
如果只有面值1,那么所有值都是1.
如果有两种面值1,5.那么dp[i] = dp[i] + dp[i - 5];从5开始算。
所以。
来源:https://www.cnblogs.com/yueyebigdata/p/5097429.html
