📜  N 和 K 组合因子的计数 (nCk)(1)

📅  最后修改于: 2023-12-03 15:33:04.986000             🧑  作者: Mango

N 和 K 组合因子的计数 (nCk)

在数学中,组合数(Combination)是由一个集合中取出若干个不同元素(不考虑顺序)组成的组合,也称为组合或者组合数。组合数的计算是很常见的一个问题,特别是在排列组合、概率论中。

组合数公式如下:

$$C_n^k=\frac{n!}{k!(n-k)!}$$

其中,$n$ 表示集合中元素的个数,$k$ 表示取出的元素个数。

程序中,可以用递归、非递归、递推等方法实现组合数的计算。以下是 Java 语言的代码实现:

递归实现
public static int Combination(int n, int k) {
    if(k==0 || k==n)
        return 1;
    else
        return Combination(n-1,k-1)+Combination(n-1,k);
}
非递归实现(动态规划)
public static int Combination(int n, int k) {
    int[][] C = new int[n+1][k+1];
    for(int i=0;i<=n;i++)
        C[i][0]=1;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=Math.min(i,k);j++) {
            if(j==i) {
                C[i][j]=1;
            } else {
                C[i][j]=C[i-1][j-1]+C[i-1][j];
            }
        }
    }
    return C[n][k];
}
递推实现
public static int Combination(int n, int k) {
    int[] C = new int[k+1];
    C[0] = 1;
    for(int i=1;i<=n;i++) {
        for(int j=Math.min(i,k);j>0;j--) {
            C[j] = C[j-1] + C[j];
        }
    }
    return C[k];
}

上述三个方法本质相同,只是实现方式不同。其中,递推实现最为高效,复杂度为 $O(k)$。如果需要计算大量组合数,建议使用最后一种实现方式。

总之,组合数的计算是一项简单但应用广泛的技术,值得我们深入学习和掌握。