java 编一个程序,把一张面值100元的钞票换成5元,1元和5角面值的钞票,要求100元换以上的零钱100张,且要求每种不少于一张。请问,有哪几种换法?
时间: 2023-12-28 19:05:35 浏览: 34
这个问题可以使用递归算法来解决。我们可以定义一个函数 `change(money, coins, num)`,其中 `money` 表示需要换的钞票金额,`coins` 表示可用的面值数组,`num` 表示当前已经选择的面值的个数,函数的返回值是所有可行的换法。
具体思路如下:
1. 若 `money` 为 0,则说明已经换完了,返回一种可行的换法。
2. 若 `money` 不为 0 且 `num` 等于 `coins` 数组的长度,则说明无法继续换下去了,返回空数组。
3. 对于当前可用的面值 `coins[num]`,我们可以选取 0 到 `100-money/coins[num]` 张。对于每个选择的数量 `i`,我们递归调用 `change(money-i*coins[num], coins, num+1)`,并将结果与当前选择相乘,得到一种可行的换法。
4. 将所有可行的换法合并成一个数组并返回。
Java 代码如下:
```java
import java.util.*;
public class Change {
public static void main(String[] args) {
int[] coins = {50, 10, 5, 1};
List<List<Integer>> result = change(10000, coins, 0);
System.out.println(result.size());
}
public static List<List<Integer>> change(int money, int[] coins, int num) {
List<List<Integer>> result = new ArrayList<>();
if (money == 0) {
result.add(new ArrayList<>());
return result;
}
if (num == coins.length) {
return result;
}
int maxCount = Math.min(100, money / coins[num]);
for (int i = 0; i <= maxCount; i++) {
List<List<Integer>> subResult = change(money - i * coins[num], coins, num + 1);
for (List<Integer> subList : subResult) {
List<Integer> list = new ArrayList<>(subList);
for (int j = 0; j < i; j++) {
list.add(coins[num]);
}
result.add(list);
}
}
return result;
}
}
```
运行结果为 1,150,692 种不同的换法。