组合数大小的求法
组合数C(n,m)的大小有以下两种计算方法:
(1) 直接用定义求,时间复杂度:O(m)
int combi(int n, int m){ //求组合数的函数 int res = 1; for(int i = 0; i < m; ++i) { res *= n - i; res /= i + 1; } return res; }
(2) 用递推式打表:
可以使用以下递推式来求组合数C(n,m),C(n,m)可以用二维数组C[n][m]表示,通过以下公式,可以递推得出每一项的C[i][j]的值(动态规划)。
时间复杂度:O(n2)
#define MAXN 20 int C[MAXN][MAXN]; int n; int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) { C[i][0] = C[i][i] = 1; for(int j = 1; j < i; ++j) { C[i][j] = C[i-1][j-1] + C[i-1][j]; } } return 0; }