圓排列
圓排列就是圍成乙個圓。圓旋轉一下是同乙個排列。因此
從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,第一位可以是...