Is there an efficient algorithm for integer partitioning with restricted number of parts?

前端 未结 5 884
天涯浪人
天涯浪人 2020-12-01 11:32

I have to create a method that takes two integers, let them be n and m, and returns how many ways there are to sum m positive numbers

5条回答
  •  温柔的废话
    2020-12-01 12:05

    public static long p(final long n, final long m) {
        System.out.println("n=" + n + ", m=" + m);
        return p(n, 1, m);
    }
    
    private static long p(final long n, final long digitFrom, final long m) {
        final long digitTo = n - m + 1;
        if (digitFrom > digitTo) return 0;
        if (m == 1) return 1;
        long sum = 0;
        for (long firstDigit = digitFrom; firstDigit <= digitTo; firstDigit++)
            sum += p(n - firstDigit, firstDigit, m - 1);
        return sum;
    }
    

    Example debug:

    n=6, m=3
    1+1+4
    1+2+3
    2+2+2
    

    From debug version:

    public static long p(final long n, final long m) {
        System.out.println("n=" + n + ", m=" + m);
        return p(n, 1, m, new Stack());
    }
    
    private static long p(final long n, final long digitFrom, final long m, Stack digitStack) {
        final long digitTo = n - m + 1;
        if (digitFrom > digitTo) return 0;
        if (m == 1) {
            digitStack.push(n + "");
            printStack(digitStack);
            digitStack.pop();
            System.out.println();
            return 1;
        }
        long sum = 0;
        for (long firstDigit = digitFrom; firstDigit <= digitTo; firstDigit++) {
            digitStack.push(firstDigit + "+");
            sum += p(n - firstDigit, firstDigit, m - 1, digitStack);
            digitStack.pop();
        }
        return sum;
    }
    

提交回复
热议问题