PHẦN 1: KỸ THUẬT ĐẾM
CHƯƠNG 1
TỔ HỢP
1. Giới thiệu môn học toán rời rạc
- Toán rời rạc là một lĩnh vực của toán học, nghiên cứu các đối tuợng rời rạc. Ví dụ tập các số
nguyên, tập hợp các sinh viên trong một lớp là tập hợp các đối tượng rời rạc, tập hợp các số thực
không phải là tập hợp các đối tượng rời rạc mà là tập các đối tượng liên tục.
- Toán rời rạc là môn học quan trọng trong ngành tin học vì máy tính chỉ lưu trữ và xử lý các đối
tương rời rạc nên việc tìm hiểu, nghiên cứu các tính chất của các đối tương rời rạc là rất cần thiết.
- Toán rời rạc được chia thành hai phần: phần 1 trình bày các bài toán cơ bản của lý thuyết tổ hợp
như là bài toán đếm, bài toán tồn tại, bài toán liệt kê, bài toán tối ưu; phần 2 trình bày lý thuyết đồ
thị, đồ thị là một cấu trúc rời rạc được ứng dụng để giải nhiều bài toán trong tin học.
2. Tập hợp
2.1Các bài toán về tập hợp
Một cấu hình tập hợp là một cách phân bố các phần tử của một tập hợp theo những điều kiện xác
định. Ví dụ: một chỉnh hợp lặp hoặc không lặp, một hoán vị, một tổ hợp chặp k … gọi là một cấu
hình tập hợp. Có 4 bài toán cơ bản về tập hợp:
- Bài toán đếm: Đếm số cấu hình thoả mãn các điều kiện cho trước
- Bài toán liệt kê: Liệt kê tất cả các cấu hình thoả mãn các điều kiện cho trước
- Bài toán tối ưu: Tìm cấu hình tốt nhất theo một nghĩa nào đó.
- Bài toán tồn tại: Có hay không các cấu hình thoả mãn các điều kiện cho trước
Ví dụ:
+ Bài toán đếm: Đếm số chỉnh hợp lặp chặp k của tập hợp có n phần tử: Đáp số = n
k
+ Bài toán liệt kê: Liệt kê các hoán vị của tập hợp X={1,2,3}: (1,2,3); (1,3,2); (2,1,3); (2,3,1);
(3,1,2); (3,2,1)
+ Bài toán tối ưu: Tìm tổ hợp chặp k của tập hợp X={1,2,3,…,n} sao cho tổng các phần tử của tổ
hợp này là lớn nhất: (n-k+1,..,n)
2.2Các phép toán trên tập hợp
- Phần bù của A trong X (X gọi là tập vũ trụ chứa A): là tập các phần tử thuộc X nhưng
không thuộc A , kí hiệu
A
- Hợp của hai tập hợp A và B: là tập các phần tử thuộc A hay thuộc B, kí hiệu:
{ : }A B x x A hay x B
∪ = ∈ ∈
- Giao của hai tập hợp A và B: là tập các phần tử thuộc A và thuộc B, kí hiệu:
{ : }A B x x A va x B
∩ = ∈ ∈
- Hiệu của hai tập hợp A và B: là tập các phần tử thuộc A nhưng không thuộc B, kí hiệu:
\ { : }A B x x A va x B= ∈ ∉
A
A
X
A
∩
B
A
B
A
DIENLOI.NET - 1 -
B
A
∪
B
A
B
A\B
(Giản đồ Venn biểu diễn các phép toán)
Ghi chú:
Tập hợp cùng với các phép toán trên tập hợp gọi là đại số tập hợp. Các phép toán trên tập
hợp có thể chuyển sang các phép toán trên mệnh đề. Mệnh đề và các phép toán trên mệnh đề
gọi là đại số mệnh đề.
- Phủ định A: kí hiệu NOT A
⇔
A
- Tuyển của A và B: kí hiệu A OR B (A V B)
⇔
A
∪
B
- Hội của A và B: kí hiệu A AND B (A
∧
B)
⇔
A
∩
B
2.3Các tính chất của các phép toán
- Tính kết hợp
( ) ( )
( ) ( )
A B C A B C
A B C A B C
∪ ∪ = ∪ ∪
∩ ∩ = ∩ ∩
//Dạng mệnh đề
(A||B)||C=A||(B||C)
(A&&B)&&C=A&&(B&&C)
- Tính giao hoán
A B B A
A B B A
∪ = ∪
∩ = ∩
//Dạng mệnh đề
A||B=B||A
A&&B=B&&A
- Tính phân bố
( ) ( ) ( )
( ) ( ) ( )
A B C A B A C
A B C A B A C
∪ ∩ = ∪ ∩ ∪
∩ ∪ = ∩ ∪ ∩
//Dạng mệnh đề
A||(B&&C)=(A||B)&&(A||C)
A&&(B||C)=(A&&B)||(A&&C)
- Tính đối ngẫu
A B A B
A B A B
∪ = ∩
∩ = ∪
//Dạng mệnh đề
!(A||B)=!A&&!B
!(A&&B)=!A||!B
2.4Tích Đề Các
Tích Đề Các của hai tập hợp A và B là một tập hợp mà mỗi phần tử là một cặp (a,b), với a
∈
A, b
∈
B. Kí hiệu
AxB={(a,b)| a
∈
A, b
∈
B}
Mở rộng:
Tích Đề Các của nhiều tập hợp
A
1
x A
2
x … x A
k
= { (a
1
, a
2
, …, a
k
) |a
i
∈
A
i
, i = 1,2,…,k }
A
k
= A x A x … x A (k lần)
DIENLOI.NET - 2 -
3. Quan hệ tương đương
3.1Định nghĩa
Tập hợp R
⊆
X
2
gọi là một quan hệ tương đương trên X, nếu thoả các tính chất sau:
- Tính phản xạ: với mọi a
∈
X, a có quan hệ R với a
∀
a
∈
X, (a,a)
∈
R
- Tính đối xứng: nếu a có quan hệ R với b thì b có quan hệ R với a
∀
a, b
∈
X: (a,b)
∈
R
⇒
(b,a)
∈
R
- Tính bắc cầu: nếu a có quan hệ R với b và b có quan hệ R với c thì a có quan hệ R với c
∀
a, b, c
∈
X: (a,b), (b,c)
∈
R
⇒
(a,c)
∈
R
Ghi chú: nếu (a,b)
∈
R ta nói a có quan hệ R với b và kí hiệu a R b
(a,b)
∈
R
⇔
a R b
Ví dụ:
Cho X={1,2,3,4}. Xét quan hệ “chia hết” R trên tập X; R={(a,b)| a chia hết cho b ; a,b
∈
X}.
R có là quan hệ tương đương trên X?
HD: Xét ba điều kiện
- Tính phản xạ:
∀
a
∈
X, hiển nhiên a chia hết cho a
⇒
a có quan hệ R với a
⇒
(a,a)
∈
R
⇒
R có tính phản xạ
- Tính đối xứng:
4 chia hết cho 2
⇒
(4,2)
∈
R, nhưng 2 không chia hết cho 4
⇒
(2,4)
∉
R
⇒
R không có tính đối xứng
- Tính bắc cầu:
∀
a,b,c
∈
X: (a,b), (b,c)
∈
R
⇒
a chia hết cho b, b chia hết cho c
⇒
a=k
1
b, b=k
2
c
⇒
a = (k
1
k
2
)c = kc
⇒
a chia hết cho c
⇒
(a,c)
∈
R
⇒
R có tính bắc cầu
Do không có tính đối xứng nên R không phải là quan hệ tương đương trên X.
* Nhận xét: số quan hệ có thể xây dựng trên tập có n phần tử là
2
2
n
3.2Lớp tương đương và phân hoạch
Một quan hệ tương đương trên tập X sẽ chia X thành các tập con gọi là các lớp tương đương sao
cho hai phần tử ở cùng một lớp thì có quan hệ với nhau và hai phần tử khác lớp thì không có
quan hệ với nhau. Gọi X
1
,…,X
n
là các lớp tương đương, ta có:
X=
1
n
i
i
X
=
∪
(1)
X
i
∩
X
j
=
∅
∀
i
≠
j (2)
Tập hợp S= {X
i
| i=1,…,n} thoả hai tính chất (1) và (2) gọi là một phân hoạch của tập X.
Ngược lại với một phân hoạch bất kỳ trên X sẽ có quan hệ tương đương trên X sinh ra phân
hoạch này. Cách xây dựng qhtđ R từ phân hoạch {X
i
} như sau: aRb
⇔
∃
X
i
: a,b
∈
X
i
Ví dụ:
Nếu a và b có cùng số dư khi chia cho k, kí hiệu là a
≡
b (mod k).
Cho X={1,2,…,m}, và k<m. Xét quan hệ “đồng dư” R; R={(a,b)| a
≡
b (mod k) ; a,b
∈
X}
a) R có là quan hệ tương đương trên X?
b) Nếu R là quan hệ tương đương trên X, tìm phân hoạch S tương ứng với R
DIENLOI.NET - 3 -
HD:
a) Xét ba tính chất
- Tính phản xạ:
∀
a
∈
X, hiển nhiên a
≡
a (mod k)
⇒
(a,a)
∈
R
⇒
R có tính phản xạ
- Tính đối xứng:
∀
a,b
∈
X: (a,b)
∈
R
⇒
a
≡
b (mod k)
⇒
b
≡
a (mod k)
⇒
(b,a)
∈
R
⇒
R có tính đối xứng
- Tính bắc cầu:
∀
a, b, c
∈
X: (a,b), (b,c)
∈
R
⇒
a
≡
b (mod k), b
≡
c (mod k)
⇒
a
≡
c (mod k)
⇒
(a,c)
∈
R
⇒
R có tính bắc cầu
Do thoả cả ba điều kiện nên R là quan hệ tương đương trên X.
c) Một số chia cho k chỉ có thể có số dư là 0, hoặc 1, …, hoặc k-1 nên các phần tử x
∈
X chia
cho k dư là i (0,..,k-1) sẽ có quan hệ đồng dư R với nhau. Gọi tập X
i
gồm các phần tử chia cho
k dư là i.
X
i
={x
∈
X| x mod k =i}; i=0,…,k-1. Ta có:
X=
1
0
k
i
i
X
−
=
∪
và X
i
∩
X
j
=
∅
∈
i
≠
j
nên S= {X
i
| i=1,…,n} là một phân hoạch của tập X.
4. Công thức cộng và công thức nhân
4.1Công thức cộng
Gọi N(X) là số phần tử của tập X (bản số của X)
a) X
1
∩
X
2
=
∅
⇒
N(X
1
∪
X
2
)= N(X
1
)+N(X
2
)
b) {X
1
,X
2,
…,X
n
} là một phân hoạch của tập X
⇒
N(X)=N(X
1
)+N(X
2
)+…+N(X
n
)
Ví dụ :
Một đoàn vận động viên gồm hai môn bắn súng và bơi. Nam có 10 người. Số vận động viên bắn
súng là 14. Số nữ thi bơi bằng số nam thi bắn súng. Hỏi đoàn có bao nhiêu người?
HD:
Gọi X là tập hợp các vđv. Phân hoạch tập X thành các tập sau:
X
1
: nữ bơi, X
2
: nữ bắn súng
X
3
: nam bơi, X
4
: nam bắn súng
Ta có:
N(X)=N(X
1
)+N(X
2
)+N(X
3
)+N(X
4
) (công thức cộng)
Nam có 10 người
⇒
N(X
3
)+N(X
4
)=10 (1)
Số vđv bắn súng = 14
⇒
N(X
2
)+N(X
4
)=14 (2)
Nữ bơi=nam bắn súng
⇒
N(X
1
)=N(X
4
) (3)
Từ (3) thay N(X4) = N(X1) vào (1), rồi cộng (1) với (2) ta được:
N(X
3
)+N(X
1
)+N(X
2
)+N(X
4
)= 24
⇒
N(X)=24
4.2Công thức nhân
a) Nếu mỗi thành phần x
i
của bộ có thứ tự (x
1
,…,x
n
) có k
i
khả năng chọn thì số bộ khác nhau
là tích của các khả năng này k
1
k
2
… k
n
b) N(X
1
x X
2
x … x X
n
) = N(X
1
) x N(X
2
) x …x N(X
n
)
Ví dụ:
DIENLOI.NET - 4 -
Từ Hà Nội đến Huế có 3 cách đi: máy bay, ô tô, tàu hoả. Từ Huế đến Sài Gòn có 4 cách đi: máy
bay, ô tô, tàu hoả, tàu thủy. Hỏi từ Hà Nội đến Sài Gòn (qua Huế) có bao nhiêu cách đi?
HD:
X
1
: tập hợp các cách đi từ Hà Nội đến Huế
X
2
: tập hợp các cách đi từ Huế đến Sài Gòn
X: tập hợp các cách đi từ Hà Nội đến Sài Gòn (qua Huế)
Ta có:
X=X
1
x X
2
⇒
N(X)= N(X
1
) x N(X
2
)= 3x4=12
Ví dụ:
Có bao nhiêu cách đặt tên biến độ dài 10, chỉ chứa chữ cái A, B và bắt đầu bằng AAA hoặc ABA?
HD:
Gọi X là tập các biến cần tìm. Phân hoạch X thành hai tập:
X
1
là tập các biến bắt đầu bằng AAA và X
2
là tập các biến bắt đầu bằng ABA.
Phần tử thuộc X
1
có dạng (AAAx
4
x
5
…x
10
), mỗi x
i
có hai khả năng là A hoặc B
nên N(X
1
)=2
7
=128 (công thức nhân)
Tương tự N(X
2
)=2
7
=128
⇒
N(X)= N(X
1
) + N(X
2
)= 128+128 = 256 (công thức cộng)
5. Các cấu hình tập hợp
Một cấu hình tập hợp là một cách phân bố các phần tử của một tập hợp theo những điều kiện xác
định. Các cấu hình thông dụng là chỉnh hợp, hoán vị, tổ hợp.
5.1Chỉnh hợp
a) Chỉnh hợp lặp: Một chỉnh hợp lặp chặp k của tập hợp có n phần tử là một bộ có thứ tự gồm k
phần tử lấy từ n phần tử đã cho, các thành phần có thể lặp lại.
Tập hợp gồm tất cả các chỉnh hợp lặp chặp k của tập A có n phần tử chính là tập hợp
A
k
= AxAx…xA (k lần)
⇒
Ví dụ:
Liệt kê tất cả các chỉnh hợp lặp chặp 2 của tập X={1,2,3}.
HD:
Có 3
2
=9 chỉnh hợp lặp là: (1,1),(2,2),(3,3),(1,2)(2,1),(1,3),(3,1)(2,3)(3,2)
Ví dụ:
Tính số hàm có thể xây dựng được từ tập A có k phần tử vào tập B có n phần tử
f: A B
(a
1,
…,a
k
) (b
1
,…,b
k
)
với b
i
= f(a
i
) và b
i
∈
B
HD:
Mỗi hàm có thể biểu diễn bởi một bộ k phần tử lấy từ n phần tử của tập B và do b
i
có thể trùng
nên số hàm = số chỉnh hợp lặp chặp k của n phần tử = n
k
.
Ví dụ:
Cho tập X = {x
1
, x
2
, …, x
n
} có n phần tử. Tính số tập con của tập X.
HD:
DIENLOI.NET - 5 -
Số chỉnh hợp lặp chặp k của n pt = N(A
k
)= n
k
.
Một tập con A của tập X có thể biểu diễn bằng một dãy nhị phân n phần tử. Vị trí thứ i = 1 nghĩa là
A có phần tử x
i
, vt(i)= 0 là không có x
i
. ví dụ: A={x
3
, x
1
} biểu diễn là (1,0,1,0,…0). Do số dãy nhị
phân chiều dài n là 2
n
⇒
số tập con là 2
n
.
b) Chỉnh hợp không lặp:
Một chỉnh hợp không lặp chặp k của tập hợp có n phần tử là một bộ có thứ tự gồm k phần tử lấy
từ n phần tử đã cho, các phần tử không được lặp lại.
Để xây dựng một chỉnh hợp không lặp, ta xây dựng dần từ thành phần đầu tiên, thành phần này
có n khả năng chọn. Mỗi thành phần tiếp theo, số khả năng chọn giảm đi 1 so với thành phần
đứng trước. Theo công thức nhân:
Số chỉnh hợp không lặp chặp k của n pt = n(n-1)(n-2)…(n-k+1)=
!
( )!
n
n k
−
Ví dụ
Liệt kê tất cả các chỉnh hợp không lặp chặp 2 của tập X={1,2,3}.
HD:
Có 3.2 =6 chỉnh hợp không lặp là: (1,2),(1,3),(2,1),(2,3), (3,1), (3,2)
Ví dụ:
Tính số hàm đơn ánh có thể xây dựng được từ tập A có k phần tử vào tập B có n phần tử
f: A B
(a
1,
…,a
k
) (b
1
,…,b
k
)
với b
i
= f(a
i
) và b
i
∈
B
HD:
Mỗi hàm có thể biểu diễn bởi một bộ k phần tử lấy từ n phần tử của tập B và do f đơn ánh nên
các b
i
không thể trùng
⇒
số hàm đơn ánh = số chỉnh hợp không lặp chặp k của n phần tử =
!
( )!
n
n k
−
5.2Hoán vị
Một hoán vị của tập hợp có n phần tử là một cách xếp thứ tự các phần tử đó. Một hoán vị chính là
một chỉnh hợp không lặp chặp n của n phần tử. Do đó:
Ví dụ: Liệt kê tất cả các hoán vị của tập X={1,2,3}.
HD: Có 3!=6 hoán vị là: (1,2,3) (1,3,2) (2,1,3) (2,3,1) (3,1,2) (3,2,1)
Ví dụ: Có 3 người xếp thành hàng ngang để chụp ảnh. Hỏi có thể bố trí bao nhiêu kiểu?
HD: Mỗi kiểu là một hoán vị
⇒
số kiểu = 3!=6
5.3Tổ hợp
a) Tổ hợp không lặp
- Một tổ hợp không lặp chặp k của tập hợp có n phần tử là một bộ không có thứ tự gồm k
thành phần lấy từ n phần tử đã cho (k<=n), các thành phần không được lặp lại.
- Một tổ hợp chặp k của tập hợp X có n phần tử chính là một tập con k phần tử của X.
DIENLOI.NET - 6 -
Số hoán vị của n pt = n(n-1)(n-2)…1= n!
- Số tổ hợp chặp k của tập A có n phần tử, kí hiệu là
k
n
C
hoặc C(n,k).
Gọi X là tập hợp các chỉnh hợp không lặp chập k của A. Chia X thành những lớp X
i
sao cho hai
chỉnh hợp thuộc cùng một lớp chỉ khác nhau về thứ tự. Cách chia này là một phân hoạch của X,
ví dụ xét tập A={1,2,3}, tập các chỉnh hợp không lặp chặp 2 của A là X={(1,2),(1,3),(2,1),(2,3),
(3,1), (3,2)}. Chia tập X thành 3 tập X
1
={(1,2) (2,1)}; X
2
={(1,3)(3,1)}; X
3
={(2,3)(3,2)}; {X
1
, X
2
, X
3
} là
một phân hoạch của X. Ta có số phần tử trong mỗi lớp bằng nhau và bằng k! (số hoán vị) và mỗi
lớp chính là một tổ hợp chặp k của n, do đó số lớp = số tổ hợp chặp k của n =
k
n
C
. Theo công
thưc cộng: Nếu {X
1
,X
2,
…,X
p
} là một phân hoạch của tập X
⇒
N(X
1
)+N(X
2
)+…+N(X
p
)=N(X)
Với N(X
1
)=…=N(X
n
)=k! và N(X)=
!
( )!
n
n k−
(số chỉnh hợp không lặp chặp k của n pt)
⇒
k! x
k
n
C
=
!
( )!
n
n k−
⇒
k
n
C
=
!
!( )!
n
k n k−
Ví dụ: liệt kê tất cả các tổ hợp chặp 2 của tập X={1,2,3}.
HD:
Có
! 3!
!( )! 2!(3 2)!
n
k n k
=
− −
=3 tổ hợp chặp 2 là: (1,2),(1,3),(2,3).
Ví dụ: có n đội bóng thi đấu vòng tròn. Hỏi phải tổ chức bao nhiêu trận?
HD:
1 trận gồm hai đội không kể thứ tự, lấy từ n đội. Do đó số trận chính là số tổ hợp chặp 2 của n và
bằng
! ! ( 1)
!( )! 2!( 2)! 2
n n n n
k n k n
−
= =
− −
Ví dụ: số giao điểm tối đa của các đường chéo của một đa giác lồi n đỉnh (n
≥
4).
HD:
Cứ 4 đỉnh lấy từ n đỉnh của đa giác lồi (không kể thứ tự) sẽ tạo ra hai đường chéo giao nhau tại
một điểm trong đa giác. Do đó số giao điểm chính là số tổ hợp chặp 4 của n và bằng
! ! ( 1)( 2)( 3)
!( )! 4!( 4)! 24
n n n n n n
k n k n
− − −
= =
− −
+ Một số công thức tổ hợp không lặp
a)
k
n
C
=
n k
n
C
−
b)
0
n
C
=
n
n
C
= 1 (điều kiện ngừng đệ qui)
c)
k
n
C
=
1
1
k
n
C
−
−
+
1
k
n
C
−
(n>k>0) (công thức đệ qui)
d) (x+y)
n
=
0
n
C
x
n
+
1
n
C
x
n-1
y + …+
1n
n
C
−
xy
n-1
+
n
n
C
y
n
=
0
n
k
=
∑
k
n
C
x
n-k
y
k
e) (x+1)
n
=
0
n
C
x
n
+
1
n
C
x
n-1
+ …+
1n
n
C
−
x +
n
n
C
=
0
n
k
=
∑
k
n
C
x
n-k
f)
0
n
C
+
1
n
C
+…+
n
n
C
=2
n
⇒
số tập con của tập n phần tử là 2
n
(đã cm ct này bằng chỉnh hợp lặp)
DIENLOI.NET - 7 -
Số tổ hợp không lặp chặp k của n pt =
k
n
C
=
!
!( )!
n
k n k−
g)
0
n
C
-
1
n
C
+…+(-1)
n
n
n
C
= 0
⇒
số tập con có số phần tử là số chẵn = số tập con có số phần tử là
số lẻ.
h) n
0
n
C
+(n-1)
1
n
C
+…+
1n
n
C
−
= n 2
n-1
g) (n+1)
0
n
C
+n
1
n
C
+…+
n
n
C
= (n+1) 2
n+1
Chứng minh: xem như bài tập
Từ công thức b) và c) ta có thể tính được tất cả các hệ số
k
n
C
bằng tam giác Pascal như sau:
0
0
C
0
1
C
1
1
C
0
2
C
1
2
C
2
2
C
⇒
0
3
C
1
3
C
2
3
C
3
3
C
vv…
dòng n (n= 0,1,2,…,) là các hệ số của (x+y)
n
b) Tổ hợp lặp
Một tổ hợp lặp chặp k của tập hợp có n phần tử là một bộ không có thứ tự gồm k thành phần
lấy từ n phần tử đã cho (k có thể lớn hơn n), các thành phần có thể lặp lại.
Ví dụ:
Một học sinh đến cửa hàng mua 4 cây bút chọn trong ba màu khác nhau là xanh, đỏ, vàng. Có
bao nhiêu cách khác nhau để chọn mua hàng?
HD:
Có các trường hợp sau:
+ 4 bút cùng màu: 4 bút cùng xanh, hoặc cùng đỏ hoặc cùng vàng => số cách = 3
+ 3 bút cùng màu: 3 bút cùng xanh, hoặc cùng đỏ hoặc cùng vàng; bút còn lại chọn một trong
hai màu còn lại => số cách= 3*2=6
+ 2 bút cùng màu, 2 bút còn lại khác màu: 2 bút cùng xanh, hoặc cùng đỏ hoặc cùng vàng; hai
bút còn lại chọn một trong hai màu còn lại => số cách= 3
+ 2 cặp bút cùng màu: số cách=C(2,3)=3
tổng cộng có = 3+6+3+3=15 cách
Nhận xét:
- Gỉa sử chọn hai xanh, một đỏ, một vàng = {x,x,d,v} nên một cách chọn chính là một tổ hợp
lặp chặp k=4 của tập n=3 phần tử {x,d,v}.
- Nếu liệt kê như cách làm trên sẽ rất khó mở rộng cho trường hợp có nhiều bút và nhiều màu
để chọn. Ta có thể giải bằng cách khác tổng quát hơn như sau:
Biểu diễn mỗi trường hợp bởi 4 dấu “+” và 2 dấu “–“ đặt liên tiếp trên một đường thẳng: số dấu
“+” bên trái dấu “-“ đầu tiên là số bút xanh, số dấu “+” giữa hai dấu “-” là số bút đỏ và số dấu cộng
ở bên phải dấu “-” cuối cùng là số bút vàng. Ví dụ:
4 xanh: ++++--
3 xanh, 1 đỏ:+++-+-
2 xanh, 1đỏ, 1 vàng: ++-+-+
2 đỏ, 2 vàng: -++-++
DIENLOI.NET - 8 -
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
vv…
Như thế mỗi cách chọn tương ứng với việc chọn 2 vị trí trong số 6 vị trí để làm dấu “-” . Nên
mỗi cách chọn là một tổ hợp không lặp chặp 2 của 6 phần tử=>số cách =
2
6
C
=15 cách
vậy số cách chọn k bút từ n màu = số tổ hợp lặp chặp k của tập n phần tử = số tổ hợp không lặp
chặp n-1 của tập k+n-1 phần tử, nên:
Ví dụ:
1/ Có k vật đồng chất nhau, hỏi có bao nhiêu cách chia chúng vào n hộp phân biệt nhau?
Ví dụ: có 3 vật chia vào 2 hộp thì có các cách chia sau: 111,222,112, 221
vậy mỗi cách chia là một tổ hợp lặp chặp 3 của tập hai phần tử {1,2}
=> số cách chia =
1
k
n k
C
+ −
2/ Tìm số nghiệm nguyên không âm của phương trình sau: x
1
+x
2
+…+x
n
= k (k là số nguyên
không âm).
Gọi k là số vật, n là số hộp, x
i
là số vật cất vào hộp i . Bài toán trở thành bài toán chia k vật
đồng chất vào n hộp phân biệt và mỗi nghiệm là một cách chia => số nghiệm=số cách chia =
1
k
n k
C
+ −
DIENLOI.NET - 9 -
Số tổ hợp lặp chặp k của tập n phần tử =
1
1
n
n k
C
−
+ −
=
1
k
n k
C
+ −
CHƯƠNG 2
BÀI TOÁN ĐẾM
1. Giới thiệu bài toán đếm
+ Bài toán đếm: là đếm số cấu hình tập hợp thoả các điều kiện cho trước.
+ Phương pháp đếm:
- Phương pháp 1 :
Đưa cấu hình cần đếm về các cấu hình đã biết như là chỉnh hợp lặp, không lặp, hoán vị, tổ
hợp chặp k. Sau đó áp dụng các công thức tổ hợp:
- Phương pháp 2 :
Đếm tập vũ trụ X, đếm phần bù
A
(đếm số cấu hình không thoả điều kiện), sau đó áp dụng công
thức phần bù:
Áp dụng cách này khi đếm phần bù
A
dễ hơn là đếm A
- Phương pháp 3:
Đưa bài toán đang xét về các bài toán nhỏ hơn, giải quyết các bài tóan nhỏ này rồi dùng công
thức cộng và nhân: .
Áp dụng cách này khi bài toán lớn khó giải trực tiếp, đưa về bài toán nhỏ dễ giải hơn.
Ví dụ:
Có 5 nguời A,B,C,D,E. Có bao nhiêu cách xếp 5 người đứng thành hàng ngang sao cho A không
đứng cạnh B.
HD:.
A={ các cách xếp A không đứng cạnh B}
⇒
tính N(A)
+X={tất cả các cách xếp };
⇒
N(X)=số hoán vị của 5 phần tử=5!
+
A
={ các cách xếp A đứng cạnh B}
A đứng cạnh B nên có thể xem dãy còn 4 phần tử và A có thể đứng bên trái B (…AB…) hoặc bên
phải B (….BA…)
⇒
N(
A
)= 4! + 4! =2.4!
DIENLOI.NET - 10 -
Số chỉnh hợp lặp chặp k của n pt = N(A
k
)= n
k
.
Số chỉnh hợp không lặp chặp k của n pt = n(n-1)(n-2)…(n-k+1)=
!
( )!
n
n k
−
Số hoán vị của n pt = n(n-1)(n-2)…1= n!
Số tổ hợp chặp k của n pt =
k
n
C
=
!
!( )!
n
k n k−
N(A)=N(X) – N(
A
).
* Công thức cộng
N(X) là số phần tử của tập X (bản số của X)
a) X
1
∩
X
2
=
∅
⇒
N(X
1
∪
X
2
)= N(X
1
)+N(X
2
)
b) {X
1
,X
2,
…,X
n
} là một phân hoạch của tập X
⇒
N(X)=N(X
1
)+N(X
2
)+…+N(X
n
)
* Công thức nhân
a) Nếu mỗi thành phần x
i
của bộ có thứ tự (x
1
,…,x
n
) có k
i
khả năng chọn thì số bộ khác
nhau được tạo ra là tích của các khả năng này k
1
k
2
… k
n
b) N(X
1
x X
2
x … x X
n
) = N(X
1
) x N(X
2
) x …x N(X
n
)
+ N(A)= N(X) – N(
A
) = 5!-2.4! =120 – 48 =72
2. Công thức cộng tổng quát
X
Ghi chú:
- N
1
= N(X
1
)+… +N(X
m
); N
m
= N(X
1
∩
…
∩
X
m
)
- Số tập giao của k tập lấy từ m tập là
k
m
C
Ví dụ m=3
N(X
1
∪
X
2
∪
X
3
)= N(X
1
)+N(X
2
) +N(X
3
)
- [N(X
1
∩
X
2
) +N(X
2
∩
X
3
)+N(X
3
∩
X
1
)] + N(X
1
∩
X
2
∩
X
3
)
N
1
=N(X
1
)+N(X
2
) +N(X
3
)
N
2
=N(X
1
∩
X
2
) +N(X
2
∩
X
3
)+N(X
3
∩
X
1
)
N
3
= N(X
1
∩
X
2
∩
X
3
)
Cm:
Lấy x
∈
X
1
∪
X
2
∪
…X
m
ta cm x chỉ được đếm một lần theo công thức b.
G/s x thuộc vào giao của k tập nào đó, theo công thức b, số lần x được đếm như sau:
1
k
C
-
2
k
C
+
3
k
C
- …+(-1)
k-1
k
k
C
= 1 – [
0
k
C
-
1
k
C
+
2
k
C
-
3
k
C
- …+(-1)
k
k
k
C
] = 1-0=1
⇒
x được đếm 1 lần (đpcm).
Gọi X là tập vũ trụ chứa các X
i
, Y = X - (X
1
∪
X
2
∪
…X
m
)
Ta có:
N(Y)=N(X) - N(X
1
∪
X
2
∪
…X
m
)
⇒
N(Y)=N(X) - N
1
+ N
2
-…+(-1)
m
N
m
Công thức bù:
N
là số phần tử không thuộc bất cứ X
i
nào. N: số phần tử của X
Ví dụ:
Có bao nhiêu dãy nhị phân có chiều dài bằng 10 hoặc là bắt đầu bởi 00 hoặc kết thúc bởi 11.
HD:
X
1
={các dãy bắt đầu bởi 00}; X
2
={các dãy kết thúc bởi 11}
X={các dãy bắt đầu bởi 00 hoặc kết thúc bởi 11}
X=X
1
∪
X
2
⇒
N(X)= N(X
1
)+N(X
2
) – N(X
1
∩
X
2
) = 2
8
+2
8
-2
6
= 448
DIENLOI.NET - 11 -
a) N(X
1
∪
X
2
)= N(X
1
)+N(X
2
) – N(X
1
∩
X
2
)
b) N(X
1
∪
X
2
∪
…X
m
)= N
1
– N
2
+…+(-1)
m-1
N
m
.
Trong đó N
k
là tổng các phần tử của tất cả các giao của k tập lấy từ m tập
N
= N - N
1
+ N
2
-…+(-1)
m
N
m
Ví dụ:
Cho X={1,2,…,10000}, có bao nhiêu số không chia hết cho bất cứ số nào trong 3 số 3,4,7
HD:
X
i
={ x
∈
X | x chia hết cho i}; i=3,4,7
Y={ x
∈
X | x không chia hết cho bất cứ số nào trong 3 số 3,4,7}
⇒
Y = X - (X
3
∪
X
4
∪
X
7
)
⇒
N(Y)=N(X) - N
1
+ N
2
-N
3
N
1
= N(X
3
)+N(X
4
) +N(X
7
) =[10000/3]+[10000/4]+[10000/7]=7261
N
2
=N(X
3
∩
X
4
) +N(X
4
∩
X
7
)+N(X
7
∩
X
3
) =[10000/12]+[10000/28]+[10000/21]=1666
N
3
= N(X
3
∩
X
4
∩
X
7
)=[10000/84]=119
⇒
Y =10000-7261+1666-119=4286
Ví dụ: Bài toán bỏ thư
Có n lá thư và n phong bì ghi sẵn địa chỉ. Bỏ ngẫu nhiên các lá thư vào các phong bì. Hỏi xác xuất
để xảy ra không một lá thư nào bỏ đúng địa chỉ là bao nhiêu?
HD:
X= {tất cả các cách bỏ thư}
⇒
N(X) = n!
X
i
={các cách bỏ lá thứ i đúng địa chỉ } ; i=1,…,n
Y={ các cách bỏ không có lá nào đúng địa chỉ }
Y = X - (X
1
∪
X
2
∪
…X
n
)
⇒
N(Y)=N(X) - N(X
1
∪
X
2
∪
…X
m
)
⇒
N(Y)=N(X) - N
1
+ N
2
-…+(-1)
n
N
n
N
k
là tổng các phần tử của tất cả các “giao của k tập” lấy từ n tập X
1,…,
X
n
.
Ta có:
Giao của k tập X
i1,
…, X
ik
là một tập gồm các cách bỏ lá k lá gồm lá thứ i1,…,ik đúng địa chỉ. Tập
giao này sẽ có (n-k)! phần tử mà số tập “giao của k tập” là
k
n
C
⇒
N
k
=
k
n
C
x (n-k)! =
!
!
n
k
Ví dụ: có 5 lá thư và 5 phong bì (n=5), thư i phải bỏ vào phong bì i. Xét trường hợp 2 thư bỏ đúng
địa chỉ (k=2), có
2
5
C
trường hợp như vậy.
Phong bì 1 2 3 4 5
Thư X 2 X 4 X
số cách bỏ 3 lá thư còn lại bằng số hoán vị của (5-2) = 3!=6 cách
⇒
N(Y)= n! (1-
1
1!
+
1
2!
-…+
( 1)
!
n
n
−
)
⇒
n! cách bỏ thư có N(Y) cách bỏ sao cho không lá nào đúng địa chỉ
⇒
Xác xuất để không một lá thư nào bỏ đúng địa chỉ là :(1-
1
1!
+
1
2!
-…+
( 1)
!
n
n
−
)
3. Công thức truy hồi
DIENLOI.NET - 12 -
D
n
= n!(1-
1
1!
+
1
2!
-…+
( 1)
!
n
n
−
)
(D
n
gọi là số mất thứ tự)
3.1 Khái niệm
Trong nhiều trường hợp, việc tìm công thức f(n) tính trực tiếp số cấu hình theo tham số n là khó
hoặc không thể được. Khi đó ta có thể tìm công thức tính f(n) theo các giá trị của hàm f trước đó
f(n-1), f(n-2),…Công thức này gọi là công thức truy hồi hay công thức đệ qui. Khi xây dựng công
thức truy hồi cần phải biết một số giá trị ban đầu của hàm f (biết f(0),f(1)…).
Trong một số trường hợp từ công thức truy hồi ta có thể suy ra công thức trực tiếp. Công thức
truy hồi rất thích hợp để cài đặt bằng phương pháp đệ qui trên máy tính.
Ví dụ: Xây dưng công thức truy hồi tính số mất thứ tự D
n
Đánh số thư và phong bì từ 1 đến n, thư i gởi đúng địa chỉ nếu bỏ vào phong bì i. Một cách bỏ thư
là một hoán vị (a
1
,…,a
n
) của tập {1,2,…,n}, a
i
là thư. Một cách bỏ thư không thư nào đúng địa chỉ
là 1 hoán vị (a
1
,…,a
n
) sao cho a
i
≠
i,
∀
i;
G/s n=5 , hoán vị (a
1
, a
2
, a
3
, a
4
, a
5
) = (2,5,1,3,4) là một cách bỏ thư không thư nào đúng địa chỉ
Phong bì 1 2 3 4 5
Thư 2 5 1 3 4
Xét a
1
: a
1
có n-1 giá trị k=2,…,n. Với một giá trị k của a
1
, có hai trường hợp của a
k
+ a
k
=1: số cách bỏ thư không thư nào đúng địa chỉ là D
n-2
(do a
1
, a
k
đã sai địa chỉ)
+ a
k
≠
1: số cách bỏ thư không thư nào đúng địa chỉ là D
n-1
(do a
1
sai địa chỉ, a
k
chưa biết)
⇒
Một trường hợp của a
1
= k có D
n-2
+ D
n-1
cách bỏ thư không thư nào đúng địa chỉ,mà k có n-1
giá trị nên tổng số cách bỏ thư không thư nào đúng địa chỉ là:
Công thức này gọi là công thức truy hồi, có thể suy ra công thức trực tiếp như sau:
D
n
= (n-1) (D
n-2
+ D
n-1
) =(n-1)D
n-2
+ nD
n-1
– D
n-1
⇒
D
n
– nD
n-1
= - (D
n-1
- (n-1)D
n-2
);
đặt V
n
= D
n
– nD
n-1
⇒
V
n
= - V
n-1
= V
n-2
=…= (-1)
n-1
V
1
= (-1)
n
(do V
1
= -1)
⇒
D
n
– nD
n-1
= (-1)
n
⇒
!
n
n
D
-
1
( 1)!
n
n
D
−
−
=
( 1)
!
n
n
−
Cộng các đẳng thức sau và rút gọn
1
1!
D
-
0
0!
D
=
1
1!
−
2
2!
D
-
1
1!
D
=
1
2!
…
!
n
n
D
-
1
( 1)!
n
n
D
−
−
=
( 1)
!
n
n
−
----------------------------------
⇒
D
n
= n!(1-
1
1!
+
1
2!
-…+
( 1)
!
n
n
−
)
DIENLOI.NET - 13 -
D
n
= (n-1) (D
n-2
+ D
n-1
),
∀
n
≥
2
Với D
0
=1 (qui ước), D
1
=0, D
2
=1
Ví dụ: Xây dưng công thức truy hồi tính tổ hợp chặp k của n phần tử
k
n
C
X= {các tổ hợp chặp k của n phần tử}
⇒
N(X) =
k
n
C
Chọn a là một phần tử bất kỳ trong n phần tử
X
1
= {các tổ hợp chặp k sao cho các tổ hợp này chứa a}
⇒
N(X
1
)=
1
1
k
n
C
−
−
X
2
= {các tổ hợp chặp k sao cho các tổ hợp này không chứa a}
⇒
N(X
2
)=
1
k
n
C
−
⇒
X = X
1
∪
X
2
và X
1
∩
X
2
=
∅
⇒
N(X)= N(X
1
) + N(X
2
)
⇒
công thức truy hồi
G/s X={1,2,3,4,5}, n=5, k=3.
⇒
N(X) =
k
n
C
=
3
5
C
= 10
Chọn a=2
X
1
= { {1,2,3}; {1,2,4}; {1,2,5}; {2,3,4}; {2,3,4}; {2,4,5} }
⇒
N(X
1
)=
1
1
k
n
C
−
−
=
2
4
C
=6
X
2
= { {1,3,4}; {1,3,5}; {1,4,5}; {3,4,5} }
⇒
N(X
2
)=
1
k
n
C
−
=
3
4
C
=4
⇒
N(X)= N(X
1
) + N(X
2
) = 6+4=10
3.2 Giải công thức truy hồi (khử đệ qui)
Giải công thức truy hồi là chuyển công thức truy hồi về công thức trực tiếp. Chỉ một vài dạng
công thức truy hồi đặc biệt mới có thể chuyển sang trực tiếp.
a
n
được tính dựa vào k số hạng liên tiếp ngay trước a
n
( …, a
n-k
, …, a
n-1
, a
n
, … )
Cần phải biết trước k số hạng đầu tiên: a
0
, …,a
k-1
.
Ví dụ : a
n
= 2a
n-1
– 3a
n-2
(n
≥
2) ;với a
0
=1, a
1
= 2
là công thức truy hồi tuyến tính thuần nhất hệ số hằng bậc 2
Ta tìm a
n
có dạng a
n
= r
n
. Thay a
n
vào (1) ta được:
r
n
= c
1
r
n-1
+ c
2
r
n-2
+…+ c
k
r
n-k
, cho n=k
⇒
Xét ctth tuyến tính thuần nhất hệ số hằng bậc k=2: a
n
= c
1
a
n-1
+ c
2
a
n-2
(3). Phương trình đặc trưng
tương ứng là: r
2
- c
1
r- c
2
= 0 (4). Ta có hai định lý sau:
a) Định lý 1:
DIENLOI.NET - 14 -
k
m
C
=
1
1
k
n
C
−
−
+
1
k
n
C
−
( với
0
n
C
=
n
n
C
=1 )
* Công thức truy hồi tuyến tính thuần nhất hệ số hằng bậc k :
a
n
= c
1
a
n-1
+ c
2
a
n-2
+ …+ c
k
a
n-k
(n
≥
k) (1)
Với a
0
= C
0
, …, a
k-1
=C
k-1
(c
1
, c
2
, …, c
k
, C
0
,…, C
k-1
là các hằng số )
r
k
- c
1
r
k-1
- c
2
r
k-2
-…- c
k
= 0 (2)
(2) gọi là phương trình đặc trưng của (1)
Cm:
(
⇐
) ta cm c
1
a
n-1
+ c
2
a
n-2
= a
n
c
1
a
n-1
+ c
2
a
n-2
= c
1
(
1
α
1
1
n
r
−
+
2
α
1
2
n
r
−
) + c
2
(
1
α
2
1
n
r
−
+
2
α
2
2
n
r
−
) =
1
α
2
1
n
r
−
(c
1
r
1
+ c
2
) +
2
α
2
2
n
r
−
(c
1
r
2
+ c
2
) =
1
α
1
n
r
+
2
α
2
n
r
= a
n
(Do r
1
, r
2
là nghiệm của ptđt
⇒
2
1
r
= c
1
r
1
+ c
2
,
2
2
r
= c
1
r
2
+ c
2
)
(
⇒
) ta cm a
n
=
1
α
1
n
r
+
2
α
2
n
r
bằng qui nạp:
G/s đẳng thức đúng với n-1, n-2 ta chứng minh đúng với n. Do a
n
là nghiệm của ctth
⇒
a
n
= c
1
a
n-1
+ c
2
a
n-2
= c
1
(
1
α
1
1
n
r
−
+
2
α
1
2
n
r
−
) + c
2
(
1
α
2
1
n
r
−
+
2
α
2
2
n
r
−
) (do giả thiết qui nạp)
⇒
1
α
2
1
n
r
−
(c
1
r
1
+ c
2
) +
2
α
2
2
n
r
−
(c
1
r
2
+ c
2
) =
1
α
1
n
r
+
2
α
2
n
r
(Do r
1
, r
2
là nghiệm của ptđt )
Tìm
1
α
,
2
α
:
C
0
=
1
α
+
2
α
; C
1
=
1
α
r
1
+
2
α
r
2
; do r
1
≠
r
2
.
⇒
* Phương pháp dùng phương trình đặc trưng để khử đệ qui
B1: Tìm ptđt
B2: Giải ptđt, suy ra dạng tổng quát của a
n
(dạng 5)
B3: Tính các hệ số của a
n
dựa vào các điều kiện ban đầu. Suy ra công thức trực tiếp
Ví dụ:
Cho dãy Fibonaci F
n
dạng truy hồi: F
n
= F
n-1
+ F
n-2
, n
≥
2; F
0
=F
1
=1. Tìm dạng trực tiếp
HD:
B1: Tìm Ptđt: r
2
- r- 1 = 0
B2: Giải ptđt: ptđt có hai nghiệm r
1
=
1 5
2
+
, r
2
=
1 5
2
−
⇒
F
n
=
1
α
1
n
r
+
2
α
2
n
r
B3: Tính các hệ số của F
n
F
0
=F
1
=1
⇒
1
α
+
2
α
=1 ;
1
α
r
1
+
2
α
r
2
=1
⇒
1
α
= (1-r
2
)/(r
1
-r
2
) =
1 5
2 5
+
;
2
α
= (1-r
1
)/(r
2
-r
1
) =
5 1
2 5
−
⇒
F
n
=
1 1
1 1 5 1 5
2 2
5
n n+ +
+ −
−
÷ ÷
÷ ÷
Chú ý: định lý 1 không áp dụng khi ptđt có nghiệm kép, khi đó ta áp dụng định lý 2:
b) Định lý 2:
DIENLOI.NET - 15 -
G/s ptđt (4): r
2
- c
1
r- c
2
= 0 có hai nghiệm phân biệt r
1
, r
2
. Ta có:
Ctth (3): a
n
= c
1
a
n-1
+ c
2
a
n-2
⇔
a
n
=
1
α
1
n
r
+
2
α
2
n
r
(
1
α
,
2
α
là hằng số) (5)
1
α
= (C
1
–C
0
r
2
)/(r
1
-r
2
);
2
α
= (C
0
r
1
–C
1
)/(r
1
-r
2
);
G/s ptđt (4) : r
2
- c
1
r- c
2
= 0 có nghiệm kép r
0
. Ta có:
Ctth (3): a
n
= c
1
a
n-1
+ c
2
a
n-2
⇔
a
n
=
1
α
0
n
r
+
2
α
n
0
n
r
(
1
α
,
2
α
là hằng số)
Cm: chứng minh tương tự định lý 1
Ví dụ:
Tìm nghiệm cho ctth: a
n
=6a
n-1
- 9a
n-2
; a
0
=1, a
1
=6
B1: Tìm Ptđt: r
2
- 6r + 9 = 0
B2: Giải ptđt: ptđt có nghiệm kép r
0
=3
⇒
a
n
=
1
α
3
n
+
2
α
n.3
n
.
B3: Tính các hệ số của a
n
a
0
=1, a
1
=6
⇒
1
α
=1; 3
1
α
+3
2
α
=6
⇒
2
α
=1
⇒
a
n
= 3
n
+n.3
n
.
Tổng quát của định lý 1 ta có định lý 3.
c) Định lý 3:
Cm: chứng minh tương tự định lý 1
Ví dụ:
Cho a
n
= 6 a
n-1
– 11 a
n-2
+ 6 a
n-3
với a
0
=2, a
1
=5, a
2
=15. Tìm ct trực tiếp
HD:
B1: Tìm Ptđt: r
3
- 6r
2
+11r - 6 = 0
B2: Giải ptđt: ptđt có ba nghiệm phân biệt r
1
=1, r
2
=2, r
3
=3.
⇒
a
n
=
1
α
1
n
+
2
α
2
n
+
3
α
3
n
.
B3: Tính các hệ số của a
n
a
0
=2, a
1
=5, a
2
=15
⇒
1
α
=1;
2
α
= -1,
3
α
=2
⇒
a
n
= 1 -2
n
+2.3
n
.
* Nhận xét: ptđt (2) không phải lúc nào cũng giải được, ta có một phương pháp khác để tìm công
thức trực tiếp đó là dùng hàm sinh.
4. Hàm sinh
4.1 Khái niệm
Xét dãy {h
n
} vô hạn (nếu hữu hạn ta chuyển thành dãy vô hạn bằng cách xem các phần tử còn lại
bằng 0).
Ví dụ:
(1+x)
n
=
k
n
0
C
n
k
k
x
=
∑
⇒
g(x) =(1+x)
n
là hàm sinh của dãy h
k
=
k
n
C
; k=0,…,n
Ví dụ:
DIENLOI.NET - 16 -
G/s ptđt (2): r
k
- c
1
r
k-1
- c
2
r
k-2
-…- c
k
= 0 có k nghiệm phân biệt r
1
, r
2
, …, r
k
. Ta có:
Ctth (1): a
n
= c
1
a
n-1
+ c
2
a
n-2
+ …+ c
k
a
n-k
⇔
a
n
=
1
α
1
n
r
+…+
k
α
n
k
r
(
i
α
là hằng số)
g(x)=
0
i
i
i
h x
∞
=
∑
= h
0
+ h
1
x
1
+…+ h
n
x
n
+…
Hàm g(x) gọi là hàm sinh của dãy {h
n
}
1
1 x−
= 1+
1
x
x−
=1+ x +
2
1
x
x
−
=1+ x + x
2
+
3
1
x
x
−
+….= 1+x+x
2
+…+x
n
+…=
0
i
i
x
∞
=
∑
⇒
g(x) =
1
1 x−
là hàm sinh của dãy h
k
= 1;
∀
k
Ví dụ:
1
(1 )
k
x
−
= (1+x+x
2
+…)
k
= (1+x+x
2
+…)…(1+x+x
2
+…) (nhân k lần) =
0
i
i
i
h x
∞
=
∑
, tìm h
n
= ?
Hệ số h
n
của x
n
là số nghiệm nguyên không âm của phương trình
t
1
+ t
2
+…+t
k
= n (
i
t
x
là số hạng của thừa số thứ i
)
và số nghiệm này bằng
1
k
n k
C
+ −
⇒
g(x)=
1
(1 )
k
x
−
là hàm sinh của dãy h
n
=
1
k
n k
C
+ −
4.2 Một số hàm sinh thông dụng (chuỗi lũy thừa)
a) (1+x)
m
=
k
m
0
C
m
k
k
x
=
∑
b)
1
1
1
m
x
x
+
−
=
−
0
m
k
k
x
=
∑
c)
1
1 x−
=
0
n
n
x
∞
=
∑
d)
1
1
k
x−
=
0
( )
n
n
k
x
∞
=
∑
e)
1
(1 )
k
x
−
=
n
n+k-1
0
C
n
n
x
∞
=
∑
f)
1
(1 )
k
rx
−
=
n
n+k-1
0
(C )
n n
n
r x
∞
=
∑
4.3 Dùng hàm sinh để đếm số cấu hình
* Phương pháp:
B1: Xây dựng hàm sinh: mỗi giả thiết là một hàm sinh, hàm sinh cần xây dựng là tích của các hàm
sinh mà suy ra từ giả thiết
B2: Rút gọn hàm sinh đưa về dạng
0
n
n
n
h x
∞
=
∑
B3: h
n
chính là số cấu hình cần đếm
Ví dụ:
Tìm số cách chọn n bông từ 3 bông cúc, 2 bông lay ơn, 4 bông hồng.
HD:
B1: Xây dựng hàm sinh:
g(x)=(1+x+x
2
+x
3
)(1+x+x
2
)(1+x+x
2
+x
3
+x
4
),
B2: Rút gọn hàm sinh (tự rút gọn)
DIENLOI.NET - 17 -
g(x)=
9
0
n
n
n
h x
=
∑
với h
n
là số nghiệm nguyên không âm của phương trình
n= a+b+c ( 0
≤
a
≤
3; 0
≤
b
≤
2; 0
≤
c
≤
4)
B3: h
n
là số cách chọn.
Việc nhân nhiều đa thức không phù hợp cho việc tính tay nhưng đối với máy tính là dễ dàng, chỉ
cần viết hàm nhân hai đa thức từ đó tính được các hệ số h
n
.
Ví dụ :
Tìm số cách chọn n qủa từ 4 loại quả: táo, chuối, cam, đào (mỗi loại có số lượng ít ra là n) mà
trong đó có một số chẵn quả táo, số lượng quả chuối chia hết cho 5, không quá 4 quả cam và
không quá 1 quả đào.
HD:
B1: Xây dựng hàm sinh:
g(x)=(1+x
2
+x
4
+…)(1+x
5
+x
10
+…)(1+x+x
2
+x
3
+x
4
)(1+x)
B2: Rút gọn hàm sinh
g(x)=
2
1
1 x−
x
5
1
1 x−
x
5
1
1
x
x
−
−
x (1+x) =
2
1
(1 )x
−
=
n
n+1
0
C
n
n
x
∞
=
∑
=
0
( 1)
n
n
n x
∞
=
+
∑
B3: suy ra số cach chọn h
n
= n+1
4.4 Dùng hàm sinh khử đệ qui
* Phương pháp
B1: Xây dựng công thức giải tích của hàm sinh, dựa vào công thức đệ qui
B2: Chuyển công thức giải tích về công thức lũy thừa (hàm sinh) :
0
n
n
n
h x
∞
=
∑
B3: Suy ra h
n
chính là công thức trực tiếp.
Ví dụ:
Cho h
n
= 4h
n-2
; h
0
=0; h
1
=1. Tìm công thức trực tiếp.
HD:
B1: Xây dựng công thức giải tích của hàm sinh
g(x)=
0
n
n
n
h x
∞
=
∑
= h
0
+ h
1
x + h
2
x
2
+h
3
x
3
+…+h
n-2
x
n-2
+h
n-1
x
n-1
+h
n
x
n
+…
4x
2
g(x)=4h
0
x
2
+4h
1
x
3
+…+4h
n-2
x
n
+…
⇒
g(x)- 4x
2
g(x)= h
0
+ h
1
x=x
⇒
g(x)=
2
1 4
x
x−
=
1 1 1
4 1 2 1 2x x
−
− +
B2: Chuyển công thức giải tích về công thức lũy thừa
g(x)=
0 0
1
(2 ) ( 2 )
4
k k
k k
x x
∞ ∞
= =
− −
∑ ∑
=
0
1
[2 ( 2) ]
4
k k k
k
x
∞
=
− −
∑
B3: Suy ra h
n
= [2
n
- (-2)
n
]/4 là công thức trực tiếp.
* Cách khác:
DIENLOI.NET - 18 -
g(x)=
0
n
n
n
h x
∞
=
∑
= x+
2
n
n
n
h x
∞
=
∑
= x+
2
2
4
n
n
n
h x
∞
−
=
∑
= x+4
2
2
n
n
n
h x
∞
+
=
∑
=x+4x
2
g(x)
Ví dụ:
Tìm công thức trực tiếp của dãy Fibonaci bằng hàm sinh
HD:
B1: Xây dựng công thức giải tích của hàm sinh
F(x)=
0
n
n
n
f x
∞
=
∑
= f
0
+ f
1
x+
2
n
n
n
f x
∞
=
∑
=1+x+
1 2
2
( )
n
n n
n
f f x
∞
− −
=
+
∑
=1+x+
1
2
n
n
n
f x
∞
−
=
∑
+
2
2
n
n
n
f x
∞
−
=
∑
= 1+x+
1
1
n
n
n
f x
∞
+
=
∑
+
2
0
n
n
n
f x
∞
+
=
∑
=1+x+x(F(x)-1)+x
2
F(x)=1+x F(x)+x
2
F(x)
⇒
F(x)=
2
1
1 x x− −
B2: Chuyển công thức giải tích về công thức lũy thừa
α
= (1-
5
)/2;
β
= (1+
5
)/2; là nghiệm của 1-x-x
2
=0
⇒
F(x)=
1
1 1x x
α β
α β α β
−
− − −
=
0 0
1
( ) ( )
k k
k k
x x
α α β β
α β
∞ ∞
= =
−
−
∑ ∑
=
1 1
0
k k
k
k
x
α β
α β
+ +
∞
=
−
−
∑
⇒
f
n
=
1 1n n
α β
α β
+ +
−
−
=
1 1
1 1 5 1 5
2 2
5
n n
+ +
+ −
−
÷ ÷
÷ ÷
DIENLOI.NET - 19 -
CHƯƠNG 3
BÀI TOÁN TỒN TẠI
5. Giới thiệu bài toán
+ Bài toán tồn tại: Xét xem có hay không có một cấu hình thoả điều kiện cho trước, nếu có thì chỉ
ra cách xây dựng một cấu hình. Nhiều khi việc xây dựng cấu hình cụ thể là khó hoặc không thể,
khi đó ta chỉ cần chứng minh là có hoặc không có cấu hình.
+ Phương pháp giải bài tóan tồn tại
- Phương pháp phản chứng
- Nguyên lý Dirichlet.
6. Phương pháp phản chứng
Để chứng minh mệnh đề p
⇒
q, ta có thể chứng minh mệnh đề tương đương là
q
⇒
p
. Hay nói
cách khác là gỉa sử kết luận (q) là sai , từ đó dẫn đến mâu thuẫn với giả thiết (p) .
* Ví dụ: bài tập 4/68
12 cầu thủ bóng rổ đeo áo với số từ 1 đến 12 đứng thành vòng tròn. Chứng minh rằng luôn tìm
được 3 người liên tiếp có tổng các số trên áo là lớn hơn hoặc bằng 20.
HD:
Gọi a
i
là số trên áo người thứ i. G/s tất cả 3 người liên tiếp đều có tổng các số trên áo
≤
19 (<20)
⇒
a
1
+ a
2
+ a
3
≤
19
a
2
+ a
3
+ a
4
≤
19
a
10
+ a
11
+ a
12
≤
19
a
11
+ a
12
+ a
1
≤
19
a
12
+ a
1
+ a
2
≤
19
----------------------------
3(a
1
+…+a
12
)
≤
19 x 12
⇒
78
≤
76 mâu thuẫn
⇒
Có 3 người liên tiếp sẽ có tổng các số trên áo là lớn hơn hoặc bằng 20.
7. Nguyên lý Direchlet
Ghi chú: mỗi cách xếp k vật vào n hộp là một tổ hợp lặp chặp k của n phần tử và số cách xếp
bằng
1
k
n k
C
+ −
* Ví dụ:
+ số vật=k=3, số hộp=n=2 => số cách xếp=
1
k
n k
C
+ −
=
3
4
C
= 4; và các cách xếp là: 111, 222, 112,
122.
+ số vật=k=4, số hộp=n=2 => số cách xếp=
1
k
n k
C
+ −
=
4
5
C
= 5; và các cách xếp là: 1111,1112, 1122,
1222, 2222.
* Ví dụ:
Trong số 367 người bao giờ cũng tìm được hai người có ngày sinh nhật giống nhau.
DIENLOI.NET - 20 -
Xếp vật vào hộp, nếu số vật nhiều hơn số hộp thì tồn tại một hộp chứa ít
nhất 2 vật.
HD :
+vật : là người => số vật=367
+hộp : là ngày => số hộp=366
số vật>số hộp =>tồn tại một hộp chứa ít nhất 2 vật=> có ít nhất 2 người cùng ngày sinh.
* Ví dụ : bài tập 5/68
Chứng minh rằng trong số 10 người bất kỳ bao giờ cũng tìm được hoặc là hai người có tổng số
tuổi là chia hết cho 16, hoặc là hai người mà hiệu số tuổi chia hết cho 16.
HD:
A
0
={ các người có tuổi chia 16 dư 0}
A
1
={ các người có tuổi chia 16 dư 1 hoặc dư 15}
…
A
7
={ các người có tuổi chia 16 dư 7 hoặc dư 9}
A
8
={ các người có tuổi chia 16 dư 8}
2 người thuộc A
i
sẽ có tổng số tuổi chia hết cho 16 hoặc hiệu số tuổi chia hết cho 16.
+ hộp: là các tập A
0
,...,A
8
=> số hộp=9
+ vật : là người => số vật = 10
số vật>số hộp=> tồn tại hộp chứa ít nhất 2 vật => tìm đươc hai người có tổng số tuổi là chia hết
cho 16, hoặc hiệu số tuổi chia hết cho 16.
*Ví dụ: bài 6/68
Cần có ít nhất bao nhiêu bộ có thứ tự gồm 2 số nguyên (a,b) sao cho chắc chắn tìm được trong
số đó hai bộ (c,d) và (e,f) sao cho c-e và d-f là các số có chữ số tận cùng bằng 0?
HD:
A
ij
= {(a,b) | a tận cùng là i, b tận cùng là j }; (i,j =0,…,9)
hai bộ (c,d) và (e,f) thuộc A
ij
sẽ có c-e và d-f là các số có chữ số tận cùng bằng 0.
+hộp: là các tập A
ij
=> số hộp=100
+vật: các bộ (a,b)
có 100 hộp => số vật ít nhất là 101 vật để có hai vật thuộc cùng một hộp
=> cần ít nhất 101 bộ (a,b) để thoả yêu cầu của đề bài.
*Vi dụ:
Xét một bảng của cơ sở dữ liệu có thể cần phải lưu trữ lên đến 500.000 mẫu tin. Hỏi có thể sử
dụng một thuộc tính với nhiều nhất 4 ký tự là các mẫu tự làm khoá chính hay không?
HD:
Theo công thức cộng và công thức nhân thì số từ khoá khác nhau là:
26
4
+ 26
3
+ 26
2
+ 26
1
=475.254
+ Hộp: là từ khoá => số hộp=475.254
+ Vật: là mẫu tin => số vật=500.000
Số vật>số hộp => sẽ có ít nhất hai mẫu tin trùng từ khoá => không thể dùng thuộc tính này làm
khoá chính được.
* Vi dụ:
Chứng minh mọi tập con A có ít nhất 6 phần tử của tập B={1,2,…,9} sẽ có hai trong số 6 phần tử
có tổng bằng 10.
HD:
Hộp: là các tập {1,9}; {2,8}; {3,7}; {4,6}; {5} => số hộp=5
Vật: là các phần tử của tập A => số vật>5
số vật >số hộp => đpcm
* Vi du :
DIENLOI.NET - 21 -
Giả sử A là một tập con có 6 phần tử của tập {1,2,…,14}. Chứng minh rằng trong số các tập con
khác rỗng của tập A, có tối đa 5 phần tử thì có ít nhất hai tập con mà tổng của các phần tử là như
nhau.
HD:
Giả sử B là một tập con khác rỗng bất kỳ của A, S
B
là tổng các phần tử của B. Ta có :
1
≤
S
B
≤
10+…+14=60
Hộp: là các số từ 1 đến 60 => số hộp=60
Vật : là các tập con khác rỗng có tối đa 5 phần tử của A =>số vật=2
6
-2=62
số vật >số hộp => có ít nhất hai tập con mà tổng của các phần tử là như nhau.
8. Nguyên lý Direchlet t ổng quát
* Ví dụ: bài 7/68
17 nhà bác học đôi một viết thư trao đổi với nhau về 3 chủ đề, mỗi cặp chỉ trao đổi với nhau về
một chủ đề. Chứng minh rằng luôn tìm được 3 nhà bác học đôi một viết thư trao đổi với nhau về
cùng một chủ đề.
HD:
Xét nhà bác học a
0
trao đổi với 16 người khác về 3 chủ đề
⇒
có 16 cuộc trao đổi về 3 chủ đề
+ hộp: chủ đề => số hộp=n=3
+ vật: cuộc trao đổi => số vật=k=16
⇒
tồn tại một hộp chứa ít nhất [k/n]=[16/3]=6 vật
⇒
có ít nhất 6 cuộc trao đổi cùng 1 chủ đề, g/s đó là chủ đề 1 và 6 cuộc trao đổi là a
0
a
1
,…,a
0
a
6
.
Nếu có một cuộc trao đổi a
i
a
j
(i,j=1,…,6) về chủ đề 1
⇒
a
0
a
i
a
j
trao đổi với nhau về cùng một chủ
đề
⇒
(đpcm)
Nếu a
i
a
j
≠
1 (i,j=1,…,6)
⇒
6 nhà bác học a
1
,…,a
6
trao đổi 2 chủ đề (2 hoặc 3)
+ hộp: chủ đề => số hộp=n=2
+ vật: nhà bác học => số vật=k=6
⇒
tồn tại một hộp chứa ít nhất [k/n]=[6/2]=3 vật
⇒
có ít nhất 3 nhà bác học trao đổi cùng 1 chủ đề.
* Ví dụ :
Cần phải tung một con xúc sắc ít nhất bao nhiêu lần để có một mặt xuất hiện ít nhất
a) 2 lần
b) 3 lần
c) n lần
HD:
Gọi số lần tung xúc sắc là k.
+ hộp: mặt của xúc sắc => số hộp=n=6
+ vật: việc tung xúc sắc => số vật=k
a) [k/6]=2
⇒
k/6>1
⇒
k>6
⇒
min(k)=7
b) [k/6]=3
⇒
k/6>2
⇒
k>12
⇒
min(k)=13
c) [k/6]=n
⇒
k/6>n-1
⇒
k> 6n-6 => min(k)=6n -5
DIENLOI.NET - 22 -
Nếu xếp k vật vào n hộp thì tồn tại một hộp chứa ít nhất [k/n] vật.
( [k/n] là số nguyên dương nhỏ nhất mà lớn hơn hay bằng k/n).
DIENLOI.NET - 23 -
CHƯƠNG 4
BÀI TOÁN LIỆT KÊ
1. Giới thiệu bài toán
Việc liệt kê cụ thể tất các cấu hình thoả một số điều kiên cho trước gọi là bài toán liệt kê. Có nhiều
cách liệt kê nhưng không được bỏ sót hoặc lặp lại một cấu hình.
Có hai thuật toán thường sử dụng để giải bài tóan liệt kê là thuật toán sinh và thuật toán
quay lui.
Vì có nhiều thuật toán để giải một bài toán nên ta cần có phương pháp để đánh giá một thuật toán
tốt hay xấu.
2. Thuật toán(Algorithms)
2.1 Khái niệm thuật toán
- Thuật toán là dãy các thao tác mà máy tính cần thực hiện theo trình tự xác định để giải
quyết một vấn đề nào đó.
- Khi viết chương trình, ta phải xây dựng cấu trúc dữ liệu và Thuật toán. Cấu trúc dữ liệu và
Thuật toán có quan hệ chặt chẽ với nhau: nếu chọn một cấu trúc dữ liệu phù hợp, Thuật
toán sẽ đơn giản, dễ mở rộng và ngược lại nếu chọn một cấu trúc dữ liệu không phù hợp,
Thuật toán sẽ phức tạp, khó mở rộng.
Công thức:
Ví dụ:
a) Tìm số lớn nhất trong 3 số cho trước.
- CTDL: sử dụng cấu trúc lưu trữ dữ liệu là 4 biến a, b, c, max (max chứa số lớn nhất)
- Thuật toán:
B0: nhập a,b,c
B1: gán max=a.
B2: so sánh b với max: nếu b>max thì lưu b vào max
B3: so sánh c với max: nếu c>max thì lưu c vào max
B4: in biến max.
- Nhận xét:
Với CTDL là các biến nguyên rời rạc a,b,c, chương trình sẽ không thể mở rộng trong trường
hợp tìm số lớn cho n số (n là số do người sử dụng nhập vào). Ta cần xây dựng lại ctdl và
Thuật toán như sau:
b) Tìm số lớn nhất trong n số cho trước (n <=100)
- CTDL: int a[100] (mảng tĩnh chứa tối đa 100 số nguyên), int max
- Thuật toán:
B0: nhập n, nhập dãy n số nguyên a[0], a[1],…,a[n-1]
B1: max=a[0]; i=1;
B2: Trong khi i<n lặp lại các bước sau:
B2.1: Nếu a[i]>max thì max=a[i];
B2.2: i=i+1;
B3: In max.
- Nhận xét:
Nếu nsd nhập vào nhiều hơn 100 số, chương trình sẽ chạy sai vì mảng không đủ để chứa dữ
liệu. Khi đó có hai cách giải quyết: dùng mảng động hoặc dùng danh sách liên kết (dslk sẽ giới
thiệu sau)
c) Tìm số lớn nhất trong n số cho trước (n không bị giới hạn trước)
DIENLOI.NET - 24 -
CẤU TRÚC DỮ LIỆU + GIẢI THUẬT = CHƯƠNG
TRÌNH
- CTDL: sử dụng mảng động, int max
- Thuật toán:
B0: nhập n, cấp phát mảng động n phần tử, nhập dãy n số nguyên a[0], a[1],…,a[n-1]
B1,B2, B3: giống câu b.
cap phat mang dong n phan tu: int *a=new int(n);
- Nhận xét: Thuật toán khi sử dụng ctdl là mảng động với Thuật toán khi sử dụng ctdl là
mảng tĩnh xem như không đổi nhưng nếu dùng ctdl là danh sách liên kết thì Thuật toán sẽ
thay đổi.
2.2 Yêu cầu của một Thuật toán
- Tính đúng: Thuật toán phải cho kết quả đúng trong mọi trường hợp
- Tính dừng: Thuật toán phải dừng sau một số hữu hạn bước thực hiện
- Tính tổng quát: Thuật toán phải giải quyết được một lớp các bài toán tương tự
- Tính đơn giản: Thuật toán phải dễ đọc, dễ sửa lỗi, dễ nâng cấp.
- Thực hiện nhanh và tiết kiệm tài nguyên máy tính
2.3 Lưu đồ của Thuật toán:
Là hình vẽ biểu diễn các bước thực hiện của Thuật toán. Có các qui ước vẽ hình sau:
Kí hiệu hình vẽ Ý nghĩa
Hướng thực hiện lệnh kế tiếp
Lệnh nhập hoặc xuất dữ liệu
Điều kiện
Đ
S
Lệnh kiểm tra điều kiện, có hai trường hợp:
nếu đúng thực hiện lệnh theo hướng mũi tên
đúng, nếu sai, thực hiện lệnh theo hướng mũi
tên sai.
Lệnh thực hiện việc tính toán, lệnh gán
Lệnh gọi chương trình con
Bắt đầu hay kết thúc Thuật toán
Ví dụ: Lưu đồ của thuật toán tìm số lớn nhất trong n số cho trước
nhập dãy a
n
Bắt đầu
max=a[0]; i=1;
i<n
Đ
S
xuất max
a[i]>max
Đ
S
max=a[i];
DIENLOI.NET - 25 -
nhập/xuất
Biểu thức
Chương trình con
Bắt đầu/ kết thúc