如题,遇到一道算法题,比如有1 2 5 10这几种金额,输入一个钱数,比如要找零37,共有160种组合,共有多少种组合,输出组合的数量,如何使用java实现呢?
完全没有思维,该如何达到呢?
最简单的就是暴力穷举
再难一点就动态规划、贪心(贪心不太确定,动态规划是可以的)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Money01 {
// 面额
static int[] money = {1, 2, 5, 10};
static List<List<Integer>> result = new ArrayList<>();
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
dfs(new ArrayList<>(), 0, n, 0);
// 打印结果
for (List<Integer> list : result) {
System.out.println(list);
}
}
/**
* 递归回溯
*
* @param lists 存放已选
* @param sum 总额
* @param current 当前额
*/
public static void dfs(List<Integer> lists, int k, int sum, int current) {
if (sum == current) {
// 符合的结果,需要重新new
result.add(new ArrayList<>(lists));
}
if (sum <= current || k >= 7 || sum < current + money[k]) {
return;
}
// 各种面值递归
for (int i = k; i < money.length; i++) {
lists.add(money[i]);
dfs(lists, i, sum, current + money[i]);
// 回溯,删除最后一个
lists.remove(lists.size() - 1);
}
}
/**
* 动态规划
* @param n 总额
*/
public static void dy(int n) {
// 纸币面额
int[] money = {1, 2, 5, 10, 20, 50, 100};
// 当前总额的组合数
int[] dp = new int[n + 1];
dp[0] = 1;
for (int i = 0; i < 7; ++i) {
// 公式
for (int j = money[i]; j <= n; ++j) {
dp[j] = (dp[j] + dp[j - money[i]]);
}
}
System.out.println(dp[n]);
}
}
感谢采纳!