zoukankan      html  css  js  c++  java
  • #排列 #组合 ~20.8.24

    基本公式

    A(n,m)为排列数公式
    A(n,m)为排列数公式。
    C(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) 。

  • 相关阅读:
    解题报告:POJ1852 Ants
    解题报告:POJ2573 Bridge(分析建模)
    POJ 3321 Apple Tree(树状数组模板)
    PAT1139 First Contact
    POJ3259 SPFA判定负环
    HDOJ2586 最近公共祖先模板
    树的直径与最近公共祖先
    字符数组_随机存储
    青鸟资料下载
    软件测试(4)_LoadRunner使用
  • 原文地址:https://www.cnblogs.com/yuanyulin/p/14026750.html
Copyright © 2011-2022 走看看