集合的排列與組合

2021-07-03 16:08:31 字數 1480 閱讀 2859

《introductory combinatorics fifth edition》學習筆記:

排列和組合的區別在於放置和選擇是否和順序有關。

集合的排列:n元素集合的r排列a(n,r)=n*(n-1)*(n-2)……(n-r+1)=n!/(n-r)!

集合的組合:n元素集合的r組合c(n,r)=n!/(n-r)!/r! [組合不考慮順序]

問題:將26個英文本母排序,要求a,e,i,o,u任意兩個不能連續出現,這樣的排序有多少個?

分析:26個英文本母的總排序數是a(26,26)=26!,5個母音字母至少兩個連續出現的情況有c(5,2)*a(2,2)*25*a(24,24)=20*2*25!=40*25!,result=(26-40)*25!這顯然不對。看來不適宜用減法原理(這樣處理,集合2並不是所求集合的「補」,第二集合多計算了)。換一種思路:先把子音字母排列好,a(21,21).接著用隔板法的思想,在22個空選出5個空再排列,於是得到,c(22,5)*a(5,5).result=21!*5!*22!/[(22-5)!*5!]=21!*22!/17!

迴圈排列:n個元素的排列不是線性的,而是呈現乙個圓狀,這樣乙個固定元素順序的環在圓上只有一種結果(因為可以旋轉,形狀不變。可以理解為先固定乙個起點元素,再對其他元素排列)。這樣算來,3個元素的迴圈排列是a(3,3)/3=2,n元素的迴圈排列結果是a(n,n)/n=(n-1)!

n元素集合的迴圈r排列的數目是s=n!/(n-r)!/r。這是建立在每一部分都含有相同數目的r排列之上的。

問題:有n(3<=n<=20)個人圍坐乙個圓桌,其中有兩人不願意彼此挨著坐,共有多少圓桌位置設定方法?

分析:彼此挨著坐的人數是2所以這裡可以用減法原理的思路來計算,s2=a(2,2)*(n-1-1)*(n-3)!.s1=(n-1)! 所以s=s1-s2=(n-1-2)*(n-2)!=(n-3)*(n-2)! 另外通過改變分析次序來足以安排座位也是可以的,先選乙個起點元素,這個起點元素就設為那特殊的兩個人之一,然後在他的右邊和左邊都安排其他非特殊的人,(n-2)*(n-3)*a(n-3,n-3)=(n-3)*(n-2)! [這裡不用乘以c(2,1),因為設定起點元素是人為的]

編碼:

#include #includeusing namespace std;

typedef unsigned long long ull; //ull最多正常表示到22!

ull f[23];

void getf()

int main()

return 0;

}

問題:用20個不同顏色的念珠做成項鍊,有多少種不同的項鍊成果?

分析:圓桌解題思路,19!,但是特殊的是項鍊還可以對稱翻轉所以s=19!/2.

n元素集合的子集數量:c(n,0)+c(n,1)+c(n,2)+……+c(n,n)=2^n。(因為c(n,t)就是(x+y)^n的項的係數,特別地,當x=1,y=1時(x+y)^n的結果也就等於c(n,0)+c(n,1)+c(n,2)+……+c(n,n)的和,即2^n )

多重集合的排列與組合

introductory combinatorics fifth edition 學習筆記 多重集合的排列 設s是有k種不同型別物件的多重集合,每個元素都有無限的重複數。那麼s的r排列數目是k r.例子 最多有4位的3進製數 3元數 的個數是多少?分析 3 4 81。設s是多重集合,有k種型別的物件...

集合元素的排列和組合

一 集合的排列 給定乙個集合s,含有n個不重複的元素,輸出該集合元素的所有排列,leetcode對應題目為 列印所有排列的複雜度為o n n 因為共有n!個不同的排列,列印每個排列的複雜度為o n 列印所有的排列一般採用深搜策略,先給出乙個常規的方法 cpp view plain copy prin...

排列與組合

include using namespace std void perm int a,int n,int m,int out,int k,int used cout endl for int i 0 i n i void combine int a,int n,int m,int out,int ...