計數的方法 可重組合和全排列

2021-08-29 18:40:54 字數 2482 閱讀 6475

圓排列

圓排列就是圍成乙個圓。圓旋轉一下是同乙個排列。因此

從n個中取r個的圓排列的排列數為 p(n,r)/r

這是因為r個中間有r個空隙,沿著r個空隙剪開可以分別得到r中排列。

項鍊排列

項鍊排列和圓排列不同的地方是項鍊是立體的,可以翻過來,是同一種排列

因此,項鍊排列的公式是p(n, r)/2r

可重排列

可重排列是指,每一種可以選擇多次。例如

26個英文本母可以組成多少個4位數的字串?答案是26^4種。

26個英文本母可以組成多少個4位數的字串,其中每位都不相同?這相當於26個選4個的排列。答案是p(26, 4)

多重排列

多重排列中,某一種可以出現多次,但是是有限的次數。例如:

pingpang這8個字元有多少種排列?

2個p, 2個n,2個g,1個i,1個a。我們可以首先把兩個的看出不同的,然後除以重複的次數

8個字元的排列p(8, 8) 除以重複的次數 2*2*2  = 8! / 2*2*2

從a=中取r個元素,ai∈a,i=1,2,..r,且允許ai=aj, i≠j

可重組合的放球模型:取r個無區別的球,n個有區別的盒子,每個盒子允許放0個1個或多個球。

對應的實際問題:有梨(1號水果)、蘋果(2號水果)、橘子(3號水果)、香蕉(4號水果)4種水果,從中選出5個。

這相當於5個無區別的球,4個有區別的盒子。

這種方案對應2個梨(1號水果),2個橘子(3號水果),1個香蕉(4號水果)。

一一對應的方法

我們可以按照盒子的序號1-n ,盒子裡有幾個球,這個序號就寫幾次,那麼上面的方案就可以表示為

1 1 3 3 4

共有5個數字,我們把它分別加上序號 0 1 2 3 4 就成了

1 2 5 6 8

最後的這個序列,我們可以看到 第乙個數字最小是1,最後乙個數字最大是5+4=9

每一種方案都可以一一對應乙個1-9中選出5個數字的無重組合。

我們再來看一下普遍的情況:

r個無區別的球,n個有區別的盒子

按照盒子編號1-n,有幾個球寫幾次 可以寫出乙個r個數字的序列。分別加上0 1 2 …… r-1

結果第乙個數字最小是1+0 最大是n+r-1 ,無重組合的個數就是從1到n+r-1中選出r個不重複的數字。

因此,無重組合的公式為:r個無區別的球,n個有區別的盒子 共有c(n+r-1,r)種。

隔板法可以轉化為 r個球,插入n-1個隔板。一共有r+n-1個位置,從中選出r個位置放球。得到結果c(n+r-1,r)

線性方程的非負整數解

線性方程x1+x2…+xn=b的非負整數解的個數是c(n+b-1,b)

這相當於b個無區別的球,n個有區別的盒子(x1到xn)

不相鄰的組合是指從a=中取r個不相鄰的數進行組合(不可重),即不存在相鄰的兩個數j, j+1的組合

從a=中取r個不相鄰的數進行組合,其組合數為c(n-r+1,r)

可以採用和無重組合類似的一一對應的方法:不同的是這裡減去序號0 1 2 3……因為不相鄰,所以減去後也是不可能相同的。

因此這也可以轉化為1 到 n-r+1 種選r個的無重組合。

例某保密裝置須同時使用若干把不同的鑰匙才能開啟。現有7人,每人持若干鑰匙。須4人到場,所備鑰匙才能開鎖。

1.至少有多少把不同的鎖?

2.每人至少持幾把鑰匙?

解1. 每3人至少缺1把鑰匙,任意4個人都不缺鑰匙,則要求每3人所缺鑰匙不同。

–如果abc缺的鑰匙和abd缺的鑰匙一樣,那abcd就不能開門

•故至少共有c(7,3)=35把不同的鎖。

2.任意4個人都不缺鑰匙,任一人對於其他6人中的每3人,都至少有1把鑰匙與之相配才能開鎖。故每人至少持c(6,3)=20把不同的鑰匙。

把所有的排列列舉出來就可以生成全排列。全排列的生成演算法就是對於給定的字符集,用有效的方法將所有可能的全排列無重複無遺漏地列舉出來。

字典序法生成全排列

按照字典中的順序。可以參考英文本典。

字典中,每個排列有唯一的前驅和後繼,相鄰排列之間差盡可能的小。

演算法實現

sjt全排列生成演算法

1) 找到最大的可移動數m(當乙個數指向乙個比它小的數是,該數就是可移動數)

2) 交換m和m所指向的數

3) 改變所有比m大的數的方向

4) 重複上面的步驟,直至找不到可移動數

庫函式中的全排列生成函式

c++標準程式庫中有兩個函式next_permutation, prev_permutation,可以生成字典序排列。

stirling公式

全排列的個數可能超出我們的想象。10個字元的全排列有10! = 3628800種。20個字元的全排列有2432902008000000000種。

stirling公式可以用來估計n!的大小。n越大,估計越精確。

多重排列和多重組合

比如有這樣乙個例子 helloo這個單詞字母排列有多少種方案呢?我們學過無重排列,那我們是不是可以轉化呢?我們把 l o 分別加上下標1,2,那麼就有6個不同的字母了。全排列的個數為6!然後我們在除以重複數字的冗餘度即 6!2 2!這就是多重排列的方案數了。那我們來擴充套件一下 二項式定理 a b ...

全排列和全組合

所謂全排列,就是列印出字串中所有字元的所有排列。例如輸入字串abc,則列印出 a b c 所能排列出來的所有字串abc acb bac bca cab和cba。一般最先想到的方法是暴力迴圈法,即對於每一位,遍歷集合中可能的元素,如果在這一位之前出現過了該元素,跳過該元素。例如對於abc,第一位可以是...

全排列和全組合實現

所謂全排列,就是列印出字串中所有字元的所有排列。例如輸入字串abc,則列印出 a b c 所能排列出來的所有字串abc acb bac bca cab和cba。一般最先想到的方法是暴力迴圈法,即對於每一位,遍歷集合中可能的元素,如果在這一位之前出現過了該元素,跳過該元素。例如對於abc,第一位可以是...