和为指定数的组合个数

问题:

输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来

解答:

排序 + 0-1背包:
若第i个数放入,剩下0~i-1个数取出sum-ai
否则0~i-1取出sum

 /**
     * 从i个数里取出和为sum的组合个数
     * 不去重
     *
     * @param i
     * @param sum
     */
    private static int fun(int i, int sum, int a[]) {
        if (i < 0 || sum <= 0) return 0;
        int cnt = 0;
        if (a[i] == sum) cnt++;
        cnt += fun(i - 1, sum - a[i], a) + fun(i - 1, sum, a);
        return cnt;
    }

    /**
     * 从i个数里取出和为sum的组合个数
     * 去重
     *
     * @param i
     * @param sum
     */
    private static Set> fun(int i, int sum, int a[]) {
        if (i < 0 || sum <= 0) return null;
        Set> ans = new HashSet<>();
        if (a[i] == sum) {
            List list=new ArrayList<>();
            list.add(a[i]);
            ans.add(list);
        }
        Set> next1 = fun(i - 1, sum - a[i], a);
        if (next1 != null) {
            for (List list : next1) {
                list.add(Integer.valueOf(a[i]));
            }
            ans.addAll(next1);
        }
        Set> next2 = fun(i - 1, sum, a);
        if (next2 != null) {
            ans.addAll(next2);
        }
        return ans;
    }

参考链接

你可能感兴趣的:(算法基础)