java实现将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法
时间: 2024-03-10 10:46:35 浏览: 61
java实现货币转换
这个问题可以使用递归来解决。
首先,我们定义一个函数,它的参数是剩余的零钱金额,以及当前已经使用了哪些面值的硬币。然后,我们可以考虑针对每种面值的硬币进行尝试,如果这种硬币可以使用,就继续递归下去,否则就跳过这种硬币。
具体来说,我们可以从大到小枚举每种面值的硬币,然后对于当前的面值,我们判断它是否可以使用。如果可以使用,那么我们就将当前的面值加入到已经使用的硬币列表中,然后递归调用函数,将剩余金额减去当前硬币面值,同时传递已经使用的硬币列表。如果剩余金额为 0,说明我们已经找到了一种有效的换法,统计答案即可。
Java代码如下:
```java
public class Main {
public static void main(String[] args) {
int n = 10;
int[] coins = {5, 2, 1};
int ans = countWays(n, coins);
System.out.println(ans);
}
public static int countWays(int n, int[] coins) {
List<Integer> used = new ArrayList<>();
int[] values = {5, 2, 1};
return dfs(n, coins, used, values, 0);
}
public static int dfs(int n, int[] coins, List<Integer> used, int[] values, int idx) {
if (n == 0) {
// 找到一种有效的换法
return 1;
}
if (idx == 3) {
// 已经尝试完了所有的硬币面值
return 0;
}
int cnt = 0;
// 尝试使用当前面值的硬币
if (n >= values[idx] && !used.contains(values[idx])) {
used.add(values[idx]);
cnt += dfs(n - values[idx], coins, used, values, idx);
used.remove(used.size() - 1);
}
// 不使用当前面值的硬币
cnt += dfs(n, coins, used, values, idx + 1);
return cnt;
}
}
```
输出结果为 2,表示一共有两种不同的换法。
阅读全文