排列組合
Lecturer:20516 陳亮延
前導
1.排列組合很吃天分
2.排列組合思維很自由
3.大多數人不會用這個思維上課
4.大多數人聽不懂這個思維
Index
1
什麼是排列組合
2
樹狀圖(窮舉法)
3
加法原理
5
階乘( ! )
4
乘法原理
1
什麼是排列組合
次序性
可能性
just排列
選擇
1
什麼是排列組合
次序性
just排列
選擇的結果
選擇
可能性
1
什麼是排列組合
just排列
選擇的結果
選擇的過程
次序性
選擇
選擇的結果
選擇的過程
次序性
選擇的過程
選擇
1
什麼是排列組合
什麼是排列組合
2
樹狀圖
把所有結果列舉出來!
Q: 請列舉 A, B, C 排列的結果(元素不可重複使用)
總共六種結果
什麼是排列組合
把所有結果列舉出來!
Q:甲乙隊打比賽(五戰三勝),請問有幾種勝負過程?
甲一開始獲勝,有10種結果
乙一開始獲勝與甲一開始獲勝等價
(起始狀態相同、競爭公平)
共有10+10=20種過程
樹狀圖的對稱性(元素狀態等價)
2
樹狀圖
什麼是排列組合
怎麼用程式模擬樹狀圖的繪製?
Sol:遞迴!
e.g. 請列舉出A, B, C, D所有排列的結果
#include <iostream>
#include <set>
#include <vector>
using namespace std;
set<char>temp;
string u={"ABCD"};
int size=4;
vector<char>resalt;
void f(int step)
{
if(step==size)
{
for(auto i:resalt)cout<<i;
cout<<'\n';
return;
}
for(int n=0;n<size;n++)
{
if(temp.count(u[n]))continue;
resalt.push_back(u[n]);
temp.insert(u[n]);
f(step+1);
temp.erase(u[n]);
resalt.pop_back();
}
return;
}
int main()
{
f(0);
}
#include <set> //引入
set<type>a; //宣告
a.insert(x); //插入x (將x加入集合a)
a.erase(x); //刪除x (將x移出集合a)
a.count(x) //檢測x是否屬於a
a.size() //n(a)
a.empty() //集合a是否為空集合
※補充 set就是集合 用法如下 演算法會教
2
樹狀圖
什麼是排列組合
怎麼用程式模擬樹狀圖的繪製?
Sol:遞迴!
※補充 map是可以自訂索引值型態的STL
有點像自訂索引值型別ㄉ陣列
#include <map> //引入
map<key_type,type>a; //宣告(儲存值皆預設0)
a[x]=123; //a裡面x對應的值設為123
a[-1]=123; //負數也能當索引值
#include <iostream>
#include <map>
#include <vector>
using namespace std;
map<string,int>temp;
string u[2]={"甲","乙"};
int size=2;
vector<string>resalt;
void f(int step)
{
if(temp["甲"]==3||temp["乙"]==3)
{
for(auto i:resalt)cout<<i;
cout<<'\n';
return;
}
for(int n=0;n<size;n++)
{
//if(temp[u[n]])continue;
resalt.push_back(u[n]);
temp[u[n]]++;
f(step+1);
temp[u[n]]--;
resalt.pop_back();
}
return;
}
int main()
{
f(0);
}
e.g.請列出甲乙隊打比賽(五戰三勝)可能過程?
Try Try See NEOJ 2024
試試遞迴作法ㄅ
2
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
陳亮延要怎麼去上資芽語法班?
- 公車:棕22
- 公車轉公車:630+1
- 公車轉捷運:630 / 12 / 212直 / 中山幹線+綠線
- YouBike:河濱公園
- 還沒蓋好的捷運:萬大線轉綠線
方法數 = 1 + 1 + 4 + 1 + 1 = 8種
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
1 |
7 | 28 | 84 | 210 | 462 | 924 | 1716 | 3003 |
1 |
6 | 21 | 56 | 126 | 252 | 462 | 792 | 1287 |
1 |
5 | 15 | 35 | 70 | 126 | 210 | 330 | 495 |
1 |
4 | 10 | 20 | 35 | 56 | 84 | 120 | 165 |
1 |
3 | 6 | 10 | 15 | 21 | 28 | 36 | 45 |
1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
從A走到B的
最短路徑量?
A
B
走到B=走到C+走到D
C
D
設定好邊界路徑量=1
每點值=左值+下值
一層一層向內
即可推斷解答
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
ZeroJudge d212 東東爬樓梯
可以選擇走一層或兩層
走到第 n 層的方法數,即走到 n-1 的方法數+走到 n-2 的方法數
⇒ 遞迴?
#include <iostream>
using namespace std;
int f(int a)
{
if(a<=1)return 1; //邊界
return f(a-1)+f(a-2);
}
int main()
{
int x;
while(cin>>x)cout<<f(x)<<'\n';
}
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
同樣的東西重複計算
把算過的東西記下來?
[5]共計算了14次
記憶化(memoization)!
(或DP (Dynamic Programming))
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
[0] | [1] | [2] | [3] | [4] | [5] |
---|---|---|---|---|---|
1 | 1 |
2
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
[0] | [1] | [2] | [3] | [4] | [5] |
---|---|---|---|---|---|
1 | 1 | 2 |
3
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
[0] | [1] | [2] | [3] | [4] | [5] |
---|---|---|---|---|---|
1 | 1 | 2 | 3 |
5
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
[0] | [1] | [2] | [3] | [4] | [5] |
---|---|---|---|---|---|
1 | 1 | 2 | 3 | 5 |
8
樹狀圖
什麼是排列組合
3
加法原理
把所有選擇加起來!
#include <iostream>
using namespace std;
int main()
{
long long a[101]; //index為階數
a[0]=1; //邊界
a[1]=1; //邊界
for(int n=2;n<101;n++)a[n]=a[n-1]+a[n-2];
int x;
while(cin>>x)cout<<a[x]<<'\n';
}
類題:
警報器長響 2s、短響 1s,
每響間間隔 1s,
響到第15秒有幾種響法?
A: 37種
樹狀圖
什麼是排列組合
樹狀圖
加法原理
把選擇過程相乘!
4
乘法原理
A走到D,不重複過點,
共有 種走法?
35
什麼是排列組合
樹狀圖
加法原理
把選擇過程相乘!
4
乘法原理
求540之因數內
- 個數?
- 和?
- 完全平方數個數?
- 完全平方數和?
- 為12的倍數而非5的倍數個數?
- 為12的倍數而非5的倍數和?
質因數相乘 = 因數
因數個數 = 質因數取捨
(分配律)
A: 24
A: 1680
A: 4
A: 50
A: 3
A: 156
什麼是排列組合
樹狀圖
加法原理
把選擇過程相乘!
4
乘法原理
由A走到B,只能→、↑、↓
(1) 走法有 種
把縱線想為陸,橫線想為橋
240
↓
3
↓
4
↓
4
↓
5
什麼是排列組合
樹狀圖
加法原理
把選擇過程相乘!
4
乘法原理
由A走到B,只能→、↑、↓
(2) 不過P的走法有 種
向上
向下
105
什麼是排列組合
樹狀圖
加法原理
把選擇過程相乘!
4
乘法原理
由A走到B,只能→、↑、↓
(3) 必過P的走法有 種
向上
(I)
向下
(III/IV)
135
I
II
III
IV
過P
(II)
過P
過P
Sol 2: 必過P = 全 - 不過P = 240 - 105 = 135
什麼是排列組合
樹狀圖
加法原理
把選擇過程相乘!
4
乘法原理
由A走到B,只能→、↑、↓
(4) 不過P也不過Q的走法有 種
向上
向下
30
什麼是排列組合
樹狀圖
加法原理
把選擇過程相乘!
4
乘法原理
4種顏色,相鄰不同色,有幾種塗法?
從影響範圍大至小下手
BD不同色,CE皆僅剩一色可塗
BD同色,CE皆剩二色可塗
什麼是排列組合
樹狀圖
加法原理
把選擇過程相乘!
4
乘法原理
5種顏色,相鄰不同色,有幾種塗法?
A: 1200
什麼是排列組合
樹狀圖
加法原理
乘法原理
5
階乘( ! )
用處:
直線排列n個獨立物
定義:
設定:
1! | 1 | 5! | 120 |
2! | 2 | 6! | 720 |
3! | 6 | 7! | 5040 |
4! | 24 | 8! | 40320 |
Index
排列組合的運算
以獨立元素為本:×/÷(正運算/逆運算)
賦予/消除次序性(獨立性)
e.g.排字母,特定字母相鄰
將特定字母綑綁為獨立元素排列,在對相鄰組計算內排列
以結果為本:+/-
集合運算
e.g. 必過 A = 全 - 不過 A
所以排組其實就是分數的四則運算而已
1
P(直線排列)
2
錯排問題&排容原理
3
相鄰不相鄰
4
同物排列
1
P(直線排列)
- 讀作:P n 取 m
- 意義:在 n 個物品(選項)中取 m 個來排列的結果(從 n 往後乘 m 次)
- 不要用,這很冗
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
$$8!排列範圍$$
$$欲排列範圍$$
$$2!排列範圍$$
以除法歸納後兩位可能性
× × × × × × ×
1
P(直線排列)
在 a , b , c , d , e 裡取三個排列,共有 種結果
60
A: n=4
2
P
0 , 1 , 2 , 3 , 4 , 5 , 6 排列,共有 種七位數結果
4320
錯排問題&排容原理
2
P
排列"builder",字首字尾排母音,共有 種結果
720
錯排問題&排容原理
2
P
錯排問題&排容原理
排列"abcdefg",'a'不排首,'b'不排尾,求有 種排列
如果首排'c',尾位只剩5種可能性
3720
2
P
錯排問題&排容原理
排容原理(限制=其中一元素不能排某一位置)
一個限制= n ! - ( n - 1 ) !
兩個限制= n ! - 2 ( n - 1 ) ! + ( n - 2 ) !
三個限制= n ! - 3 ( n - 1 ) ! + 3 ( n - 2 ) ! - ( n - 3 )!
係數成巴斯卡係數,正負相間、階乘遞減
1 , 2 , 3 , 4 , 5 , 6 ,第 n 個元素不排第 n 位,有 種方法
P
排列"fanceis",'a' , 'e'相鄰,共有 種結果
1440
錯排問題
相鄰不相鄰
3
相鄰者視為一物,並把排列結果乘以內排列可能性
P
排列"fanceis",'a' , 'e'不相鄰,共有 種結果
3600
相鄰不相鄰
3
不相鄰者排列完用插空法
錯排問題
P
相鄰不相鄰
同物排列(不盡相異物)
4
排列"success",共有 種組合
420
同物除以內排列
錯排問題
P
相鄰不相鄰
同物排列(不盡相異物)
4
從左下到右上最快速路徑有 種
3003
錯排問題
Index
1
C(組合)
2
分組分堆
3
巴斯卡定理
4
二項式定理
- 讀作: C n 取 m
- 意義:在 n 個數中取 m 個出來的組合數
⇒消除 P n 取 m 的次序性
在紅橙黃綠藍靛紫球中取三顆,共有幾種結果
A: 35種
1
C(組合)
1
C(組合)
在 n 個物品中取 x 個 = 在 n 個物品中剃除 ( n - x ) 個
A: n=3,20
1
C(組合)
有五對夫妻選出四位出任委員會,夫妻不能同時當,有幾種組合?
2
2
2
2
A: 80
1
C(組合)
有五對夫妻選出四位出任委員會,恰一對夫妻,有幾種組合?
A: 120
5 男 4 女選出四位出任委員,男女皆至少一人,有幾種組合
A: 80
10 選 4 出任班長、副班長、風紀、衛生,有兩人不能同時當,有幾種結果?
A: 4368
1 ~ 10 取三數且任兩數不連續,有幾種取法?
A: 120
某冰淇淋店最少需準備 n 桶不同口味的冰淇淋,才能滿足廣告所稱「任選兩球不同口味冰淇淋的組合數超過 100 種」。
試問來店顧客從 n 桶中任選兩球(可為同一口味)共有幾種方法?
A: 56
1
C(組合)
C(組合)
2
分組分堆
分組分堆思維:
12 | 11 | 10 | 9 |
---|
8 | 7 | 6 | 5 |
---|
4 | 3 | 2 | 1 |
---|
逆運算
逆運算
逆運算
三大堆(無次序性)逆運算
A: 5775
C(組合)
2
分組分堆
A: 27720
A: 9240
C(組合)
2
分組分堆
A: 18480
A: 34650
A: 55440
C(組合)
分組分堆
3
巴斯卡定理
n 取 m =不挑 k +必挑 k
A: 1330
A: 6985
C(組合)
分組分堆
巴斯卡定理
4
二項式定理
C(組合)
4
二項式定理
分組分堆
巴斯卡定理