zoukankan      html  css  js  c++  java
  • 排列组合 ——插隔板

                             排列组合

    ——插隔板

    I.n个相同小球分成m部分,每部分可以没有球。

    n+(m-1)个数中选择(m-1)次数作为隔板,其它的数作为小球。Count=C(n+m-1,m-1)。

     

    II.n个相同的小球分成m部分,每部分至少有1个小球。

    每个在相邻小球的中间,有n-1个隔板,从n-1个隔板中选取m-1个隔板,从而分成m部分。

    Count=C(n-1,m-1)。

     

    也可以认为:是提前从每部分提取1个小球,n个小球变为n-m个小球。可看成是把n-m个小球分成m部分,每部分可以没有球;然后把1个小球加入每部分,使每部分至少有一个球。

    Count=C((n-m)+m-1,m-1)=C(n-1,m-1)

     

    III. n个相同的小球分成m部分,每部分至少有k个小球。

    2同理,提前从每部分提取k个小球,n个小球变为n-m*k个小球。可看成是把n-m*k个小球分成m部分,每部分可以没有球;然后把k个小球加入每部分,使每部分至少有k个球。

    Count=C((n-m*k)+m-1,m-1)=C(n-m*(k-1)-1,m-1)

     

    k=1,即变为情况II

     

    IV.有n个座位依次从左到右排列,m个人选择座位,无其它要求。

    1个人有n种选择,第2个人有n-1种选择,……,第m个人有n-m+1中选择。

    Count=P(n,m)

     

    V. 有n个座位依次从左到右排列,m个人选择座位,任意两个人不能相邻。

    m个(人+座位)插入n-m个空座位的左右两旁,第1个人有n-m+1种选择,第2个人有n-m种选择,……,第m个人有n-m+1-(m-1)中选择。

     

    也可以认为:提前提取m-1个座位,n个座位变为n-m+1个座位。可看成有n-m+1个座位依次从左到右排列,m个人选择座位,无其它要求;然后把1个座位加入所有相邻(指的不是座位相邻,而是指一个人向左/向右看第一个看到的人)的两个人的中间(m-1个座位),使任意两个人能相邻。

    Count=P(n-m+1,m)

     

    VI. 有n个座位依次从左到右排列,m个人选择座位,任意两个人之间至少有k个空位。

    提前提取(m-1)*k个座位,n个座位变为n-(m-1)*k个座位。可看成有n-(m-1)*k个座位依次从左到右排列,m个人选择座位,无其它要求; 然后把k个座位加入所有相邻(指的不是座位相邻,而是指一个人向左/向右看第一个看到的人)的两个人的中间((m-1)*k个座位),使任意两个人之间至少有k个空位。

    Count=P(n-(m-1)*k,m)

    k=1,即变为情况V

     

    VII.有n个座位形成圆圈,m个人选择座位,无其它要求。

    1个人有n种选择,第2个人有n-1种选择,……,第m个人有n-m+1中选择。如果不考虑圆的位置编号,则一个状态顺时针旋转k位(k=0,1,…,n-1),状态都相同,结果在原来基础上除以n。

    考虑圆的位置编号:P(n,m)

    不考虑圆的位置编号:P(n,m)/n

     

    证明P(n,m)/n是正数:

    n-k必能整除(n,k)【括号指的是两个数的最大公约数】,若(n,k)<>1, n能被数k(1<=k<=n)所约分【即n=n/(n,k)】,那么n能用n-k代替【即(n-k)= (n-k)/(n,k)】,最终(n,m)必是n的倍数。

     

    VIII.有n个座位形成圆圈,m个人选择座位,任意两个人不能相邻。

                To  

    考虑圆的位置编号:

    定义一个人A所坐的座位编号为1,然后座位编号按照顺时针的方向从1到n递增,编号为n的座位与编号为1的座位连接起来。

    在编号为1的座位的和编号为n的座位中间切一刀,变成编号为1,2,…,n的一排座位。其中第n个位置不能坐人,第2个位置不能坐人,因为任意两个人不能相邻,而第1个位置座位有人坐。

    题目转变成n-3个座位,依次从左到右排列,m-1个人选择座位,任意两个人不能相邻。

    Count1=P(n'-m'+1,m')=P((n-3)-(m-1)+1,m-1)=P(n-m-1,m-1)

    A的编号可以为1,2,…,n,

    Count2=n*P(n-m-1,m-1)

     

    不考虑圆的位置编号:

    即不考虑什么人坐编号为多少的位置,只考虑人之间的相对关系,如一个人的左边/右边是谁

    m个人的位置顺时针旋转k位(k=0,1,2,…,n-1)【即第1个人的位置变为原来第(1+k)个人的位置,第2个人的位置变为第(2+k)个人的位置,依次类推】,有m种方案,但这里只看成1种方案,所以要除以m

    Count3=n*P(n-m-1,m-1)/m

     

    IX.有n个座位形成圆圈,m个人选择座位,任意两个人之间至少有k个空位。

    考虑圆的位置编号:

    定义一个人A所坐的座位编号为1,然后座位编号按照顺时针的方向从1到n递增,编号为n的座位与编号为1的座位连接起来。

    在编号为1的座位的和编号为n的座位中间切一刀,变成编号为1,2,…,n的一排座位。其中第n个~第n-k+1个位置不能坐人,第2个~第k+1位置不能坐人,因为任意两个人之间至少有k个空位,而第1个位置座位有人坐。

    题目转变成n-k*2-1个座位,依次从左到右排列,m-1个人选择座位,任意两个人之间至少有k个空位。

    Count=P(n'-(m'-1)*k,m')=P((n-k*2-1)-((m-1)-1)*k,m-1)=P(n-m*k-1,m-1)

    A的编号可以为1,2,…,n,

    Count2=n*P(n-m*k-1,m-1)

     

    不考虑圆的位置编号:

    即不考虑什么人坐编号为多少的位置,只考虑人之间的相对关系,如一个人的左边/右边是谁

    m个人的位置顺时针旋转k位(k=0,1,2,…,n-1)【即第1个人的位置变为原来第(1+k)个人的位置,第2个人的位置变为第(2+k)个人的位置,依次类推】,有m种方案,但这里只看成1种方案,所以要除以m

    Count3=n*P(n-m*k-1,m-1)/m

    k=1,即变为情况VIII。

     

  • 相关阅读:
    android 模拟器报 no CPU/ABI system image for target
    Android SDK Manager 更新代理配置
    IIS日志文件清理
    Android开发环境搭建
    Android 应用开发特色
    Android 系统架构
    Npm安装以及express框架的使用
    javascript中的回调函数(callback)
    Windows环境下的NodeJS+NPM+Bower安装配置
    JavaScriptSerializer 序列化json 时间格式
  • 原文地址:https://www.cnblogs.com/cmyg/p/6833356.html
Copyright © 2011-2022 走看看