首页 > (已解答)请大佬帮做个题目
头像
小曹不可爱吗
编辑于 2020-08-26 09:39
+ 关注

(已解答)请大佬帮做个题目

刚刚东方财富的题目,感觉可以用回溯,但是没做出来,有哪位同学帮忙写一下,万分感谢!

_________________________________________________________________________
更新一下,东方财富的原题还有第三个参数k,即返回所有组合中的第k项(组合按照数字大小排序,如果第一个数字相同,就使用第二个排序,一次类推)
如果没有第k项,则返回-1。我自己的代码如下,感觉还有可以优化的地方,请大佬指点!
public class solution2 {
    static List<List<Integer>> res = new ArrayList<>();

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int n = in.nextInt();
        int k = in.nextInt();
        backtrack(N, n, 1, new Stack<>());
        if (k > res.size()) {
            System.out.println(-1);
            return;
        }
        List<Integer> list = res.get(k - 1);
        int count = 0;
        for (Integer integer : list) {
            System.out.print(integer);
            if (count != n - 1) {
                System.out.print(" ");
            }
        }
    }

    private static void backtrack(int target, int n, int start, Stack<Integer> track) {
        if (sum(track) == target && track.size() == n) {
            res.add(new ArrayList<>(track));
            return;
        }
        if (track.size() == n) return;

        for (int i = start; i <= 10; i++) {
            track.add(i);
            backtrack(target, n, start + 1, track);
            track.pop();
        }
    }

    private static int sum(Stack<Integer> trace) {
        int sum = 0;
        ArrayList<Integer> list = new ArrayList<>(trace);
        for (Integer integer : list) {
            sum += integer;
        }
        return sum;
    }
}


全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐