zoukankan      html  css  js  c++  java
  • 2017.3.10组合数学学习——多重集合的排列、组合,有限概率

    多重集合的排列
    定理:设S是多重集合,他有k种不同类型的对象,每一种类型的有限重复数是n1,n2,n3,…nk。设S的大小为n=n1+n2+n3+…nk。则S的n排列数目为n!/(n1!n2!n3!…nk!)
    证明:
    先从S中选出n1个位置放a1,有C(n,n1)种放法,再选出n2个位置放a2,有C(n-n1,n2)种放法……
    由乘法原理得:
    S的排列个数=C(n,n1)*C(n-n1,n2)*C(n-n1-n2,n3)*…*C(n-n1-n2-…-nk-1,nk)
    ∵C(n,r)=p(n,r)/r!=n!/[r!*(n-r)!]
    ∴原式=  n!           (n-n1)!                (n-n1-n2-…-nk-1)!       
            --------- *   -----------     * … *---------------------- 
            n!(n-n1)!   n2!(n-n1-n2)!          nk!(n-n1-n2-…-nk)!
      去公因式可得证
    如果S只有2种对象a1,a2,重复数分比为n1,n2,其中n=n1+n2
    那么由以上定理可得
    S的排列数=n!(n1!n2!)=n!/[n1!*(n-n1)!]=C(n,n1)
    所以C(n,n1)即可以看做n对象集合的n1子集数量,
    也可以看做有两种类型的对象且重复数分别是n1和n-n1的多重集合排列数
    定理:设n是正整数,并设n1,n2,…,nk,是正整数,且n=n1+n2+…nk。把n对象集合划分为k个标有标签的盒子,且第1个盒子含有n1个对象,第2个盒子含有n2个对象,…,第k个盒子含有nk个对象,这样的划分方法数=n!(n1!n2!…nk!)
    如果盒子没有标签,且n1=n2=n3=…=nk,那么划分数=n!(k!n1!n2!…nk!)
    定理:有k种颜色的n个车,第一种颜色有n1个,第二种颜色有n2个,…,第k种颜色有nk个。把这些车放在一个n*n的棋盘上使车之间不能互相攻击的方案数=(n!)²/(n1!n2!…nk!)
    所以,一种颜色的n个车有n!种方法,n种颜色的n个车有(n!)²个
    感性认知:
    放置n个同颜色的车与n的排列有一一对应关系。即n的排列有n!种,每种排列放置的行不一都是一种新方案。颜色限制,相当于多重集合S的n排列。
    注:以上所有公式前提:n=n1+n2+…nk
    若两边不相等时
    例:S={3*a,2*b,4*c},求S的8排列数
    解:S的集合可被划分为3个部分,由多重集合排列公式可得:
        ① 少一个a:s1=8!/(2!*2!*4!)
        ② 少一个b:s2=8!/(3!*1!*4!)
        ③ 少一个c:s3=8!/(3!*2!*3!)
       ans=s1+s2+s3
    错解:s1=6!/(2!*4!)*C(7,2)
    订正:s1=6!/(2!*4!)*[C(7,2)+C(7,1)]
    因为2个a可以挨着

    多重集合的组合
    定理:设S是有k种类型对象的多重集合,每种元素均具有无限重复数。那么S的r组合的个数
    =C(r+k-1,r)=C(r+k-1,k-1)
    证明:
    设S={∞*a1,∞*a2,…,∞*ak},使得
    S的任意r组合呈{x1*a1,x2*a2…,xk*ak}的形式,其中x1,x2,…,xk均为非负整数,且x1+x2+…+xk=r。反过来,每个满足x1+x2+…+xk=r的非负整数序列x1,x2,…,xk对应于S的一个组合。因此,S的r组合个数=方程x1+x2+…+xk=r的解的个数。
    我们证明,这些解的个数=有两种那个不同类型对象且有r+k-1个对象的多重集合
    T={r*1,(k-1)*0}
    的排列的个数。
    给定T的一个排列,k-1个0把r个1分为k组,第1个0左边有x1个1,第1个0和第2个0中间有x2个1,……第k-1个0右边有xk个1。于是,x1,x2,…,xk是满足x1+x2+…xk的非负整数。反之成立。把上述步骤倒推并构造T的一个排列,
    于是多重集合S的r组合数目=多重集合T的排列的个数
    =(r+k-1)!/(r!*(k-1)!)=C(r+k-1,r)
    证毕
    可以通过对xi的限制来达到对每种类型的对象出现次数的限制
    例:设S是有4种类型的对象a,b,c,d的多重集{10*a,10*b,10*c,10*d}。每一种类型的对象至少出现一次的S的10组合的个数是多少
    解:①分析出可以忽略S中重复数10的限制
        ②ans=x1+x2+x3+x4=10的正整数解的个数
        ③另y1=x1-1,y2=x2-1,y3=x3-1,y4=x4-1
          则方程变为y1+y2+y3+y4=6 ,yi为非负整数
          所以ans=C(6+4-1,6)
    组合中每种类型出现下界都可以通过变量替换处理
    例:方程x1+x2+x3+x4=20 ,x1>=3,x2>=1,x3>=0,x4>=5
    的解的个数是多少
    解:y1=x1-3,y2=x2-1,y3=x3,y4=x4-5
    方程转化为 y1+y2+y3+y4=11
    所以ans=C(11-4+1,11)
    这里都是给出了x的下界,x若是给出上界不能这样处理
    给出上界需要结合容斥原理
    有限概率
    特点:结果有限,每个结果等可能
    例1:设n是正整数。假设在1和n之间随机选出一个整数序列i1,i2,…,in
    (1)这个选出的序列是1,2,3,…,n的排列的概率是多少
    (2)这个序列正好含有n-1个不同的整数的概率是多少
    解:(1)样本空间|S|=n^n,事件集合|E|=n! 所以ans=n!/n^n
        (2)题目理解:n-1个整数不同,即有1个整数出现了2次,有1个整数没有出现
           将n个数分为3类:
             ① 没有出现的整数,有n种可能
             则② 出现2次的整数,有n-1种可能,他的出现位置有C(n,2)种
             则③剩下的n-2个整数 ,放置方式有(n-2)!种
            所以ans=n*(n-1)*C(n,2)*(n-2)!
    例2:5个彼此相同的车随机放置在8*8棋盘的非攻位置上,这些车既在行1,2,3,4,5又在列4,5,6,7,8上的概率是多少
    解:样本空间|S|=棋盘上放5个非攻车的方案数=C(8,5)*5!
        事件|E|=5!
        所以ans=5!/(C(8,5)*5!)
       C(8,5):从8个行坐标,8个列坐标选出5个行坐标,5个列坐标的方案数
       |S|中 5!对选出来的每组行列坐标,列坐标排列分配给行坐标的方案数
       联想上面n个相同的车放n*n期盼方案数为n!,因为选出n个行坐标,n个列坐标的方案数为1
       |E|中 5!:有5!中方法把这5个车放到5*5棋盘上

  • 相关阅读:
    [Project Euler] Problem 58
    [Project Euler] Problem 59 Decrption
    [Project Euler] Problem 57
    VS2010 + WinDDK 搭建驱动开发环境
    利用C++模板特性计算各整数类型的最大最小值
    虚表的那些事儿
    ModuleNotFoundError: No module named 'pip._vendor.six'
    OpenCVPython系列之单应性查找对象理论篇
    OpenCVPython系列之背景分离
    OpenCVPython系列之Shi—tomasi拐角检测器
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6531060.html
Copyright © 2011-2022 走看看