📅  最后修改于: 2023-12-03 15:21:41.034000             🧑  作者: Mango
二项式系数是组合数学中一个常见的概念,是指从 $n$ 个不同元素中选取 $k$ 个元素的组合数。一般表示为 $\binom{n}{k}$。
计算二项式系数的常见方法有:组合公式、递推公式、杨辉三角等。其中,递推公式使用动态规划的思想,可以在 $O(n^2)$ 的时间复杂度内计算出所有的二项式系数。
设 $B_{i,j}$ 表示从 $i$ 个不同元素中选取 $j$ 个元素的组合数,则有以下递推公式:
$$ B_{i,j}= \begin{cases} 1, & j=0~\text{or}~i=j \ B_{i-1,j-1}+B_{i-1,j}, & 0<j<i \end{cases} $$
其中,第一行表示当 $j=0$ 或 $i=j$ 时,组合数为 1;第二行表示当 $0<j<i$ 时,从 $i$ 个元素中选取 $j$ 个元素的组合数可以拆分成两种情况:选第 $i$ 个元素和不选第 $i$ 个元素。
def binomial_coefficient(n, k):
"""
计算二项式系数
:param n: 元素个数
:param k: 挑选元素个数
:return: 二项式系数
"""
dp = [[0] * (k + 1) for _ in range(n + 1)]
for i in range(n + 1):
for j in range(min(i, k) + 1):
if j == 0 or i == j:
dp[i][j] = 1
else:
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
return dp[n][k]
assert binomial_coefficient(5, 2) == 10
assert binomial_coefficient(10, 5) == 252
assert binomial_coefficient(20, 10) == 184756