Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 什么';What’找到不同的整数方程组的最快方法是什么?_Algorithm - Fatal编程技术网

Algorithm 什么';What’找到不同的整数方程组的最快方法是什么?

Algorithm 什么';What’找到不同的整数方程组的最快方法是什么?,algorithm,Algorithm,方程式如下所示: x1+x2+x3+x4+…+xk=n 和(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;

方程式如下所示:

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

和(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 func(int n,int k){
断言(n>=0);
断言(k>0);
如果(n==0 | | k==1){
返回1;
}
else如果(k==2){
返回n+1;
}
否则{
整数和=0;
对于(int i=0;i=0);
断言(k>0);
如果(n==0 | | k==1){
返回1;
}
else如果(k==2){
返回n+1;
}
else如果(结果[n][k]!=0){
返回结果[n][k];
}
否则{
整数和=0;
对于(inti=0;i这听起来像是

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

(我已经从维基百科的描述中替换了n和k来匹配你的问题。)

在你给出的例子中,n=3,k=2,答案是


因此,如果预先缓存阶乘值,您应该能够快速计算k和n的任何值。

这更像是一个数学问题。
假设您有k-1个Os和n个Os。这些Os将这些Os拆分为k个分区。例如,如果k=3和n=8,则可能会这样拆分

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

什么语言,这更像是一个数学问题。
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;
    }
}
O O O | O | O O O O