代码
采用递归算法, 数组保存每个种纸币的个数
public class Test {
public static void main(String[] args) {
change(100, new int[]{10, 20, 30, 50}, 0, new Integer[4]);
for (Integer[] counts : list) {
System.out.println();
for (Integer i : counts) {
System.out.print((i == null ? 0 : i) + " ");
}
}
}
static List<Integer[]> list = new ArrayList<>();
private static List change(int total, int[] prices, int index, Integer[] counts) {
if (index < prices.length && total >= prices[index]) {
for (int i = 0; i <= total / prices[index]; i++) {
if (index == 0) {
counts = new Integer[prices.length];
}
int tmp = total;
Integer[] countsTmp = counts.clone();
countsTmp[index] = i;
tmp = tmp - prices[index] * i;
if (tmp == 0) {
list.add(countsTmp);
break;
} else if (tmp < 0) {
break;
}
change(tmp, prices, index + 1, countsTmp);
}
}
return null;
}
}
运行结果
0 0 0 2
0 1 1 1
0 2 2 0
0 5 0 0
1 0 3 0
1 2 0 1
1 3 1 0
2 0 1 1
2 1 2 0
2 4 0 0
3 1 0 1
3 2 1 0
4 0 2 0
4 3 0 0
5 0 0 1
5 1 1 0
6 2 0 0
7 0 1 0
8 1 0 0
10 0 0 0
Process finished with exit code 0