C语言编程:输入正整数n(<=1000),输出组合数C(2n,n)?
令C(m,n)表示从m个数中选取n个数的组合个数
则有递推关系:C(m,n)=C(m-1,n-1)+C(m-1,n)
可采用二维数组dp[m][n]保存C(m,n)的结果,然后从小到大递推计算即可
但注意到m维的结果只和m-1维有关,因此可以用一维数组进行简化
令dp[n]表示当前为止,选出n个数的组合个数,注意外层遍历m次,内层要逆序遍历
最后由于n可能取到1000,结果会很大,一般取余表示防止溢出
C语言代码如下所示:
#include <stdio.h>
long long dp[1001]; // 结果可能很大,用长整型
// 但长整型最大也只能表示到C(66,33) = 7219428434016265740
// 因为输入n最大为1000,所以结果可取余表示
const int MOD = 1e9 + 7; // 10^9+7,用于结果取余表示
int main() {
int n;
scanf("%d", &n);
int m = 2 * n;
dp[0] = 1; // 初始化,C(m,0)=1
for (int i = 0; i < m; ++i) { // 外层遍历m次
for (int j = n; j >= 1; --j) { // 内存要倒序遍历
//dp[j] = dp[j] + dp[j - 1]; // 若不取余,长整型最大只能表示到n=33
dp[j] = (dp[j] + dp[j - 1]) % MOD; // 取余显示,防止结果溢出
}
}
printf("C(%d,%d) = %lld\n", m, n, dp[n]);
return 0;
}
结果如图:
编译通过,示例如上,C(6,3)=20,结果正确,望采纳~