找到整数中不同方程数的最快方法是什么?

时间:2012-11-03 14:56:53

标签: algorithm

这个等式看起来像是:

x1 + x2 + x3 + x4 + ... + xk = n

和( 0< = n< = 1000,0< k< = 1000

示例:

n=3 and k=2

3+0=3 2+1=3
0+3=3 1+2=3

output: 4 // count of equations

我无法想到任何事情,即使是最糟糕的100循环方式。

3 个答案:

答案 0 :(得分:2)

n = 0 -> 1
k = 1 -> 1
k = 2 -> n + 1
k > 2 -> func(n, k - 1) + func(n - 1, k - 1) + .... + func(0, k - 1)
      // 0 + ...          1 + ...                     n + 0 + ... + 0

因此,递归地做....

int func(int n, int k) {
    assert (n >= 0);
    assert (k > 0);
    if (n == 0 || k == 1) {
        return 1;
    }
    else if (k == 2) {
        return n + 1;
    }
    else {
        int sum = 0;
        for (int i = 0; i <= n; i++) {
            sum += func(i, k - 1);
        }
        return sum;
    }
}

消除冗余计算

int result[NMAX + 1][KMAX + 1] = {0};
int func(int n, int k) {
    assert (n >= 0);
    assert (k > 0);
    if (n == 0 || k == 1) {
        return 1;
    }
    else if (k == 2) {
        return n + 1;
    }
    else if (result[n][k] != 0) {
        return result[n][k];
    }
    else {
        int sum = 0;
        for (int i = 0; i <= n; i++) {
            sum += func(i, k - 1);
        }
        result[n][k] = sum;
        return sum;
    }
}

答案 1 :(得分:2)

这听起来像second Stars and Bars theorem

  

对于任何一对自然数 k n ,非负整数的不同 k - 元组的数量,其总和为< em> n 由二项式系数给出( k + n - 1 n )......

(我已经从维基百科的描述中交换了 n k 以匹配您的问题。)

所以,在你给出的n = 3和k = 2的例子中,答案是(2 + 3 - 1 3) = (4 3) = 4! / ((4 - 3)! × 3!) = 4

因此,如果您预先缓存因子值,您应该可以快速为 k n 的任何值进行计算。

答案 2 :(得分:1)

这更像是一个数学问题 假设你有k-1 | s和n Os。 | s将这些Os分成k个分区。例如,如果k = 3且n = 8,则可以像这样分割

O O O | O | O O O O

第一分区x1具有3个Os,第二分区x2具有1个O,x3具有4个Os,即3 + 1 + 4 = 8。 因此,方程的计数是| s和Os的组合数,或C(k + n - 1,n)。