题目描述
-
硬币。给定数量不限的硬币,币值为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
分析
- 从最大面值开选,选n个最大面值,最大面值大于剩余的钱,则接下来用第二大面值的钱来凑剩下的钱,直到最后只能用1分面值表示时 退出;
Code
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
//int solve = solve(n);
int solve2 = solve2(n);
System.out.println(solve2);
//System.out.println(solve);
}
private static int solve(int n) {
int[] value= {1,5,10,25};
int index=3;
return dfs(n,value,index);
}
//对于较大数字回超时
private static int dfs(int n, int[] value, int index) {
if(index==0)
return 1;
int sum=0;
//选n个index面值
for (int i = 0; i*value[index] <= n; i++) {
sum+=dfs(n-i*value[index], value, index-1);
}
return sum%1000000007;
}
private static int solve2(int n) {
int[] value= {1,5,10,25};
int[] res=new int[n+1];
//0分钱只有一种方法
res[0]=1;
//选取value的面值
for (int i = 0; i < value.length; i++) {
for (int j = value[i]; j < res.length; j++) {
res[j]=(res[j]+res[j-value[i]])%1000000007;
}
}
return res[n];
}