我使用两种方法来计算二项式系数。一个是
int fac(int n) {
if ( n < 2 ) return 1; // return 1 when n=0,1
int ret = 1;
for(int i=2; i <= n; ++i)
ret *= i; // calculate factorial
return ret;
}
int choose_fac(int n, int k) {
return fac(n)/fac(k)/fac(n-k);
}
另一个是:
int choose_dp(int n, int k) {
int C[n+1][k+1];
int i, j;
for (i = 0; i <= n; i++) {
for (j = 0; j <= min(i, k); j++) {
if (j == 0 || j == i) C[i][j] = 1;
else C[i][j] = C[i-1][j-1] + C[i-1][j];
}
}
return C[n][k];
}
因此,当我在(15,5)上运行时,第二个给出正确的答案,而第一个给出4。我知道对于select_fac,计算15时int超出范围!但是,如果这是原因,为什么select_dp不会因为它们都使用int来定义函数,所以不会返回错误的答案吗?
非常感谢!
E.
第一个溢出int
。
调用fac(15)
计算choose_fac(15, 5)
该函数应计算的值时,1,307,674,368,000
大大超出的范围int
。计算的最终结果15 choose 5
将在的范围内,int
因为将两个相对较大的阶乘进行了划分,但是中间结果中的错误使该计算无法成功完成。
使用动态编程的第二个函数不会出现此问题,因为它没有显式计算阶乘。这种计算二项式系数的方法称为Pascal三角形。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句