zoukankan      html  css  js  c++  java
  • 组合计数

    组合计数

    关于排列组合是真的头疼...这里总结一下相关的知识点...都是简单的..
    首先从最基础的开始

    1.加法原理

    若完成一件事的方法有(n)类,其中第(i)类的党发包括(a_i)种不同的的方法,且这些方法互不重合,则完成整件事共有(a_1+a_2+a_3+cdots+a_n)种不同的方法。

    这个应该很好理解吧!就是将整件事情分成若干类,由于每一类都能独立的王成这一件事情,所以将所有的(a_i)相加就行了。

    2.乘法原理

    若完成一件事需要(n)个步骤,其中第(i)个步骤有(a_i)种不同的的完成方法,且这些步骤互不干扰,则完成这件事共有(a_1+a_2+a_3+cdots+a_n)种不同的方法。

    这个也还行,每个步骤都是整件事情的一部分,当其他的步骤不变时,其中一个步骤有(a_i)中选择,这样他的贡献就是(ans*a_i),所以总的答案贡献就是所有的(a_i)相乘。

    小结:其实加法原理和乘法原理不同点就在于到底是分成(n)类还是(n)个步骤,换句话说就是考虑你这(n)个事情到底能独立的解决整件事情还是整件事情的一部分。

    3.排列数

    从n个元素中依次选出m个元素排成一列,产生的不同排列的数量为:

    [A^m_n(也可记作P^m_n)= frac{n!}{(n-m)!}=n*(n-1)*cdots*(n-m+1) ]

    这个证明还是很简单的,我们依次考虑去选这(m)个元素,将整件事分成对(m)个步骤,第一个元素我们可以从(n)个元素中任选其一,则(a_1=n),第二个元素只能从(n-1)个元素中选择其一,所以(a_2=n-1),一直这样到第(m)个元素,那时我们已经选了(m-1)个元素,所以只剩下(n-m+1)个元素,则(a_m=n-m+1),这很明显是乘法原理,所以我们将他们相乘就行。

    4.组合数

    从n个不同的元素中取出(m)个组成一个集合(不考虑顺序),产生的不同的集合数量为

    [C^m_n=frac{n!}{m!(n-m)!}=frac{n*(n-1)*cdots*(n-m+1)}{m*(m-1)*cdots*2*1} ]

    这个证明是由排列数推出来的,首先要知道(m)元素的全排列为(m!).这个用推排列数的方法容易推得.由于排列数有顺序,而组合数不考虑顺序,所以我们在排列数的基础上消去顺序的影响就行了,每一种(m)个元素的集合由于顺序的缘故会有(m!)种方案,但这(m!)种方案在组合数种只算一种,所以需要除以(m!)就行了。所以(C_n^m=frac{A^m_n}{m!}).

    性质:

    1.(C_n^m=C^{n-m}_n)

    证明:
    由组合数的定义,从n个元素中选m个元素组成的集合和未选剩下的集合是一一对应的,所以方案数是相等的。

    2.(C_n^m=C_{n-1}^m+C^{m-1}_{n-1})

    证明:
    我们可以考虑第(n)个元素选不选,分成两类,如果选的话,我们只需要在剩下的(n-1)个元素中选择(m-1)个元素就行,方案数为(C_{n-1}^{m-1}).如果不选,我们就需要在剩下的(n-1)个元素中选择(m)个元素,方案数为(C_{n-1}^m)。符合加法原理,相加即可。

    3.(C_n^0+C_n^1+C_n^2+cdots+C_n^n=2^n)

    证明:
    (n)个不同的元素选出若干个元素组成一个集合(可以不选),一共有n+1类方法,分别是取走(0,1,2,cdots,n),这(n+1)类方法的方案数分别是相对应得组合数。符合加法原理,全部相加。但从另一个方法去想,每一个元素都有选和不选两种选择,符合乘法原理,(n)个2相乘,答案为(2^n).

    对于程序来说,如果要用到组合数,根据性质二,对于(0≤x≤y≤0)的所有组合数(C^y_x)直接递推出来,复杂度为(O(n^2))
    比较有用和常见的是用一个数组保存阶乘,一个数组保存阶乘逆元。用到时直接用就可以了。

    5.二项式定理

    ({(n+m)}^n=sum_{k=0}^n C_n^ka^kb^{n-k})

    证明:
    数学归纳法。
    (n=1)时,({(a+b)}^1=C_1^0a^0b^1+C_1^1a^1b^0=a+b.)
    假设当(n=m)时命题成立,当(n=m+1)时:

    [{(a+b)}^{m+1}=(a+b)^m(a+b)=(a+b)sum_{k=0}^mC_m^ka^kb^{m-k} ]

    [=sum_{k=0}^mC_m^ka^{k+1}b^{m-k}+sum_{k=0}^mC_m^ka^kb^{m-k+1} ]

    [=sum_{k=1}^{m+1}C_m^{k-1}a^{k}b^{m-k+1}+sum_{k=0}^mC_m^ka^kb^{m-k+1} ]

    [=sum_{k=0}^{m+1}C_m^{k-1}a^{k}b^{m-k+1}+sum_{k=0}^{m+1}C_m^ka^kb^{m-k+1} ]

    [=sum_{k=0}^{m+1}(C_m^{k-1}+C_m^k)a^{k}b^{m-k+1}=sum_{k=0}^{m+1}C_{m+1}^ka^{k}b^{m+1-k} ]

    证毕。
    (to) (be) (continued...)

  • 相关阅读:
    【NX二次开发】Block UI 组
    【NX二次开发】Block UI 双精度表
    【NX二次开发】Block UI 整数表
    自己写的简单的轮播图
    微信分享到朋友圈----摘录
    HTML5比较实用的代码
    苏格拉底的名言警句
    jQuery 幻灯片 ----摘录
    DeDe调用指定栏目ID下的文章
    JQuery 判断ie7|| ie8
  • 原文地址:https://www.cnblogs.com/gcfer/p/12987616.html
Copyright © 2011-2022 走看看