找零钱问题Java,输出组合数量

问题遇到的现象和发生背景

如题,遇到一道算法题,比如有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]);
    }

}

感谢采纳!