将整数除以k个部分

ali*_*ani 6 java algorithm integer-division

我正在用java编程,我需要制定一个算法.算法的要求是:

  • 我们有3个整数变量n,m,k,
  • 我们想要分成nk部分,以便k-parts 的总和等于n,每个部分是1和之间的整数m.
  • 我们希望所有可能的组合与允许的整数.

例如,输入集:

n = 7; m = 3; k = 4
Run Code Online (Sandbox Code Playgroud)

我们可以制定两种不同的组合:

7 = 2 + 2 + 2 + 1
Run Code Online (Sandbox Code Playgroud)

7 = 3 + 2 + 1 + 1
Run Code Online (Sandbox Code Playgroud)

谢谢你们.

Dav*_*era 3

这个想法是一种回溯算法方法(带有递归),您可以减少参数并获得部分解决方案,然后检查您是否有正确的解决方案。

public class Problem {

    private static void algorithm(int n, int k, int m) {
        algorithmRecursive(Collections.EMPTY_LIST, n, k, m, 1);
    }

    private static void algorithmRecursive(List<Integer> partial, int n, int k, int m, int min) {
        if ( (k > 0) ) {
            // Optimization
            if ((n <= k * m) && (n >= k*min)){
                for (int i = min; i <= Math.min(m, n); i++) {
                    List<Integer> newPartial = new ArrayList<>(partial);
                    newPartial.add(i);
                    algorithmRecursive(newPartial, n - i, k - 1, m, i);
                }
            }
        } else if (n == 0) {
            // Right solution
            System.out.println(partial);
        }
    }

    public static void main(String[] args) {
        algorithm(7,4,3);
    }
}
Run Code Online (Sandbox Code Playgroud)