基本公式
A(n,m)为排列数公式。
C(n,m)为组合数公式。
意思是:在n个一模一样的物品里选出(满)m个物品。
组合数递推公式
1、个人理解
C(n,m)=C(n-1,m-1)+C(n-1,m)
注意:n 在下面,m在上面
1、可以理解为:
假设我们现在只有有n-1个物品,
第一种情况:我们可以在这n-1个物品之外再添加一个新的物品(记为第n个),就要先在n-1个物品里选m-1个,再加上第n个。
而这种方法所得的数量与C(n-1,m-1)是一样的,于是我们要加上C(n-1,m-1)的数量。
第二种情况:假设我们并不想选新加进来的第n个物品,那就在原来的n-1个物品里面选m个来凑成m个物品。于是我们要加上C(n-1,m)的数量。
那么综合起来,就是C(n,m)=C(n-1,m-1)+C(n-1,m)。
2、也可以理解为:
假设我们按位置来看,对每一位的物品只有选与不选两种方案;
第一种方案:我们选这一位的物品。
那么就留一个位置给某个物品(可以理解为第m个物品),那么就剩下m-1个位置,对吧?那就请在剩下的n-1个物品里选择m-1个物品补上空位就好了。那这种方案就有C(n-1,m-1)种可能。
第二种方案:我们不选这一位的物品。
那么我们是不是要将这一位的物品排除掉?不选它嘛。那么这m个空位就只能在n-1个物品里面选咯。于是有C(n-1,m)种方案。
那么综合起来,就还是C(n,m)=C(n-1,m-1)+C(n-1,m)。
巧的是,这个递推式子可以看做一个杨辉三角。
所以C++里写作C(n,m)=C(n-1,m-1)+C(n-1,m),n代表行,m代表列。
2:另一种推导,摘自博客
组合数递推式为:
C(k,n)=(n−k+1/k)*C(k−1,n)
它可以很明显的用组合数公式证明,但是它的实际意义却并不明显。
为了更好理解,我们写出组合数递推式的等价形式:
C(k+1,n)=(n−k/k+1)*C(k,n)
推导过程:
0、我们知道组合数 C(k,n) 表示 n 个不同元素中选出 k 个元素的方法数。
1、我们如果已知 C(k,n) 的值,在每个被选中的 k 个元素的 组合,添加一个没有被选中的元素(没有被选中的元素个数为 n−k ),
这样就得到了 (n−k)*C(k,n) (这样每个组合中有 k+1 个元素)。
所以推出:C(k+1,n)=(n−k/k+1)*C(k,n)
2、但是这样选出的组合中有重复的情况:
例如形成的 k+1 个元素的组合 a1,a2,...,ak,ak+1 ,可能是
a1 添加了 a2,a3,...,ak,ak+1 形成的或者
a2 添加了 a1,a3,...,ak,ak+1 形成的或者
….........
ak 添加了 a1,a2,...,ak−1,ak+1 形成的或者
ak+1 添加了 a1,a,2...,ak−1,ak 形成的。
这样对于每一个 k+1 个元素的组合重复计数了 (k + 1)次,
所以需要除以 k+1 ,得到 C(k+1,n)= n−k/k+1 C(k,n) 。