这个等式看起来像是:
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循环方式。
答案 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)。