You are on page 1of 215

TOÁN RỜI RẠC

Tổ hợp + Đồ Thị

Đỗ Phan Thuận

thuandp.sinhvien@gmail.com
Bộ môn Khoa Học Máy Tính, Viện CNTT & TT,
Trường Đại Học Bách Khoa Hà Nội.

Ngày 8 tháng 3 năm 2018

1 / 168
Checker

Bắt đầu với một cấu hình mà toàn bộ quân cờ chỉ nằm trên hoặc dưới trục x.

2 / 168
Checker

Bước chuyển: nhảy sang ô trống nhưng phải qua đầu quân liền kề, và quân liền kề sẽ bị ăn mất.

3 / 168
Checker

Bước chuyển: nhảy sang ô trống nhưng phải qua đầu quân liền kề, và quân liền kề sẽ bị ăn mất.

4 / 168
Checker

Mục tiêu: Tìm cấu hình xuất phát có ít nhất số quân cờ để có thể dịch chuyển được đến mức k.

5 / 168
k =1

2 quân.

6 / 168
k =2

? quân.

7 / 168
k =2

Bây giờ ta đưa về cấu hình k = 1 nhưng cao hơn 1 mức. (4 quân).

8 / 168
k =3

Đây là cấu hình cho k = 2, vậy phải chuyển đến vị trí cao hơn 2 mức.

9 / 168
Checker

8 quân.

10 / 168
k =4

? quân.

11 / 168
k =4

? quân.

12 / 168
k =4

? quân.

13 / 168
k =4

? quân.

14 / 168
k =4

Bây giờ ta chuyển về cấu hình k = 3 nhưng cao hơn 1 mức. ( 20 quân.)

15 / 168
Excercise

k =5
1 39 hoặc ít hơn
2 40–50 quân
3 51–70 quân
4 71–100 quân
5 101–1000 quân
6 1001 hoặc nhiều hơn

16 / 168
Ví dụ 1

Chơi xoay Rubik thế nào?

Google: Rubik cube in 26 steps.


http://www.cse.cuhk.edu.hk/~chi/csc2110-2008/notes/Rubik-Cube.ppt

17 / 168
Ví dụ 2

Toán học cho trò chơi gấp giấy.

http://www.ushistory.org/betsy/flagstar.html
http://erikdemaine.org/foldcut/

18 / 168
Ví dụ 3

Hình 3D.

http://128.100.68.6/~drorbn/papers/PDI/

19 / 168
Một số bài toán và ứng dụng hay của ngành Toán rời rạc
1 Catalan numbers
2 Motzkin paths
3 Origami
4 Paper folding and unfolding
5 Optical illusions
6 P verses NP
7 Rubik cube
8 Turing test
9 Random number generator
10 Prime numbers
11 Graph isomorphism
12 Four colour theorem
13 Magic tricks
14 Games Theory
15 Puzzles
16 More on http://www.cse.cuhk.edu.hk/~chi/csc2110/project.html
17 ...

20 / 168
Tại sao cần Toán học cho máy tính?

Thiết kế các hệ thống tính toán hiệu quả.

Làm thế nào để Google xây dựng công cụ tìm kiếm nhanh?
Cơ sở của bảo mật trên Internet là gì?

Bài toán đếm, logic, lý thuyết số, lý thuyết đồ thị, tổ hợp . . .

21 / 168
Bài toán đếm
Tập hợp và Hàm
Tổ hợp, Hoán vị, Định lý Nhị thức
Đếm nhờ phép ánh xạ, Nguyên lý Lồng chim bồ câu (Đi-rich-lê)
Đệ quy, Suy diễn
...

Xác suất thống kê, Thuật toán, Cấu trúc dữ liệu


22 / 168
Bài toán đếm
Sắp xếp chèn trực tiếp

Sắp xếp trộn

Thuật toán nào chạy nhanh hơn?

23 / 168
Lý thuyết đồ thị

Đồ thị, Quan hệ
Đồ thị Eurler, Đẳng cấu
Cây, Cây khung
Ghép cặp
Tô màu
...

Mạng máy tính, Thiết kế mạch điện, Cấu trúc dữ liệu . . .

24 / 168
Lý thuyết đồ thị
Làm thế nào để tô màu 1 bản đồ?

Làm thế nào để truyền dữ liệu một cách hiệu quả?

25 / 168
Mục tiêu của môn học

Học các khái niệm cơ bản của toán học cho máy tính, ví dụ: tập hợp,
hàm, đồ thị;
Cải thiện kỹ năng giải bài toán ứng dụng trong máy tính;
Hiểu mối quan hệ giữa Toán rời rạc và Khoa học máy tính;
...

Bí quyết học
Làm bài tập, Làm bài tập và Làm bài tập.

26 / 168
Kiểm tra

Đánh giá
1 Thi giữa kỳ: 30%
2 Thi cuối kỳ: 70%
3 Bài tập lập trình hàng tuần: tính cộng điểm.
4 Bài tập lớn: tính cộng điểm.

Khi thi
Được phép sử dụng một tài liệu duy nhất là một tờ giấy A4 viết tay
hai mặt chuẩn bị trước.
Nộp lại cùng bài thi để tính điểm cộng cho việc chuẩn bị tài liệu tốt.

27 / 168
Bài tập lớn

Không bắt buộc


Xét cộng điểm
Thường là giải bài tập lập trình cùng với tìm hiểu lý thuyết thuật
toán liên quan
Ai muốn làm thì email kèm theo giới thiệu về bản thân:
I Họ tên, Mã SV, Lớp,. . .
I Khả năng lập trình
I Tư duy thuật toán
I Đã tham gia thi lập trình bao giờ chưa
I Giải thưởng đã có
I Mong muốn mức độ đề tài: khó, trung bình, dễ
I ...
Email: thuandp.sinhvien at gmail.com

28 / 168
Tài liệu môn học

Sách tham khảo


1 Discrete Mathematics and its Applications. Rosen K.H. McGraw - Hill
Book Company, 2006.
2 Discrete Mathematics with Applications. Susanna S. Epp. Publisher:
Brooks/Cole.
3 Mathematics for Computer Science. Albert R Meyer. Massachusets
Institute of Technology. Course note.
4 Toán rời rạc. Nghĩa N.D. and Thành N.T. NXB ĐHQG Hanoi, 2006.

Link download tài liệu


1 http://courses.csail.mit.edu/6.042/spring07/
2 http://www.cse.cuhk.edu.hk/~chi/csc2110-2008/

29 / 168
PHẦN I. TỔ HỢP

30 / 168
Chương 1. Một số kiến thức cơ bản

1 1.1 Sơ lược về tổ hợp


2 1.2 Nhắc lại lý thuyết tập hợp
3 1.3 Một số nguyên lý cơ bản
4 1.4 Các cấu hình tổ hợp đơn giản

31 / 168
1.1 Sơ lược về tổ hợp

Xuất hiện đầu thế kỷ 17


Ứng dụng trong hầu hết các lĩnh vực khoa học cơ bản
Các bài toán thường gặp
I Bài toán đếm: “Có bao nhiêu cấu hình thỏa mãn điều kiện đã nêu?”.
Ứng dụng: Tính xác suất của một sự kiện; Tính độ phức tạp thuật
toán . . .
I Bài toán liệt kê: Quan tâm đến tất cả cấu hình có thể có → Biểu diễn
dưới dạng thuật toán “Vét cạn”. Ứng dụng trong các bài toán chưa có
thuật toán hiệu quả giải
I Bài toán tối ưu: Chỉ quan tâm đến cấu hình “Tốt nhất ” theo điều kiện
đề bài. Ứng dụng lý thuyết tổ hợp tìm thuật toán hiệu quả
I Bài toán tồn tại: Có hay không lời giải còn là điều nghi vấn, không chỉ
ra được cấu hình nào nhưng cũng không chỉ ra được là chúng không
tồn tại

32 / 168
1.2 Nhắc lại lý thuyết tập hợp
1 Các khái niệm và ký hiệu
I Tập hợp: A, B, C . . . X , Y , . . .
I Phân tử: a, b, c . . . x, y , . . .
I N(A): số phần tử của tập A
I Các ký hiệu khác: ∈, ∈, / ⊂, ⊆, ∩, ∪
2 Các phép toán tập hợp
I Phần bù: Ā
I Hợp: A ∪ B
I Giao: A ∩ B
I Các ký hiệu khác: ∈, ∈,
/ ⊂, ⊆, ∩, ∪
I Kết hợp: (A ∩ B) ∩ C = A ∩ (B ∩ C ); (A ∪ B) ∪ C = A ∪ (B ∪ C )
I Giao hoán: A ∩ B = B ∩ A, A ∪ B = B ∪ A
I Phân bố: A ∩ (B ∪ C ) = (A ∩ B) ∪ (A ∩ C );
A ∪ (B ∩ C ) = (A ∪ B) ∩ (A ∪ C )
I Đối ngẫu: A ∩ B = Ā ∪ B̄; A ∪ B = Ā ∩ B̄
3 Tích Đề Các của các tập hợp: A × B = {(a, b)|a ∈ A, b ∈ B};
A1 × A2 × . . . × Ak = {(a1 , a2 , . . . ak )|ai ∈ Ai }
33 / 168
1.3 Một số nguyên lý cơ bản

1 Nguyên lý cộng:
I Nếu hai tập hợp A và B rời nhau: N(A ∪ B) = N(A) + N(B)
I Mở rộng: nếu {A1 , A2 , . . . Ak } là một phân hoạch của tập X :
N(X ) = N(A1 ) + N(A2 ) + . . . + N(Ak )
I Ví dụ: Trong tủ có 3 bánh mì patê, 5 bánh mì trứng và 10 bánh mì
chả. Hỏi có bao nhiêu sự lựa chọn 1 chiếc bánh để ăn?

34 / 168
1.3 Một số nguyên lý cơ bản

1 Nguyên lý cộng:
I Nếu hai tập hợp A và B rời nhau: N(A ∪ B) = N(A) + N(B)
I Mở rộng: nếu {A1 , A2 , . . . Ak } là một phân hoạch của tập X :
N(X ) = N(A1 ) + N(A2 ) + . . . + N(Ak )
I Ví dụ: Trong tủ có 3 bánh mì patê, 5 bánh mì trứng và 10 bánh mì
chả. Hỏi có bao nhiêu sự lựa chọn 1 chiếc bánh để ăn?
Trả lời: 3+5+10 = 18
2 Nguyên lý nhân:
I Hai tập hợp A và B bất kỳ: N(A × B) = N(A).N(B)
I Mở rộng: nếu {A1 , A2 , . . . Ak } là một phân hoặch của tập X :
N(A1 × A2 × . . . × Ak ) = N(A1 ).N(A2 ). . . . .N(Ak )
I Ví dụ: Trong tủ cú 20 bát và 10 thìa. Hỏi có bao nhiêu cách lấy ra 1
cặp bát-thìa?

34 / 168
1.3 Một số nguyên lý cơ bản

1 Nguyên lý cộng:
I Nếu hai tập hợp A và B rời nhau: N(A ∪ B) = N(A) + N(B)
I Mở rộng: nếu {A1 , A2 , . . . Ak } là một phân hoạch của tập X :
N(X ) = N(A1 ) + N(A2 ) + . . . + N(Ak )
I Ví dụ: Trong tủ có 3 bánh mì patê, 5 bánh mì trứng và 10 bánh mì
chả. Hỏi có bao nhiêu sự lựa chọn 1 chiếc bánh để ăn?
Trả lời: 3+5+10 = 18
2 Nguyên lý nhân:
I Hai tập hợp A và B bất kỳ: N(A × B) = N(A).N(B)
I Mở rộng: nếu {A1 , A2 , . . . Ak } là một phân hoặch của tập X :
N(A1 × A2 × . . . × Ak ) = N(A1 ).N(A2 ). . . . .N(Ak )
I Ví dụ: Trong tủ cú 20 bát và 10 thìa. Hỏi có bao nhiêu cách lấy ra 1
cặp bát-thìa? Trả lời: 10 . 20 = 200

34 / 168
1.4 Các cấu hình tổ hợp đơn giản
1 Chỉnh hợp lặp
I Định nghĩa: một chỉnh hợp lặp chập k của n phần tử là một bộ có thứ
tự gồm k thành phần lấy từ n phần tử đã cho. Các thành phần có thể
được lặp lại. Số chỉnh hợp lặp là nk
I Ví dụ 1: Số xâu nhị phân độ dài n

35 / 168
1.4 Các cấu hình tổ hợp đơn giản
1 Chỉnh hợp lặp
I Định nghĩa: một chỉnh hợp lặp chập k của n phần tử là một bộ có thứ
tự gồm k thành phần lấy từ n phần tử đã cho. Các thành phần có thể
được lặp lại. Số chỉnh hợp lặp là nk
I Ví dụ 1: Số xâu nhị phân độ dài n = 2n
Ví dụ 2: Có tất cả có bao nhiêu số có 5 chữ số:

35 / 168
1.4 Các cấu hình tổ hợp đơn giản
1 Chỉnh hợp lặp
I Định nghĩa: một chỉnh hợp lặp chập k của n phần tử là một bộ có thứ
tự gồm k thành phần lấy từ n phần tử đã cho. Các thành phần có thể
được lặp lại. Số chỉnh hợp lặp là nk
I Ví dụ 1: Số xâu nhị phân độ dài n = 2n
Ví dụ 2: Có tất cả có bao nhiêu số có 5 chữ số: = 9.104
2 Chỉnh hợp không lặp
I Định nghĩa: một chỉnh hợp không lặp chập k của n phần tử là một bộ
có thứ tự gồm k thành phần lấy từ n phần tử đã cho. Các thành phần
không được lặp lại. Số chỉnh hợp không lặp là
n(n − 1)(n − 2) . . . (n − k + 1)
I Ví dụ 1: Có bao nhiêu số có 3 chữ số trong đó các chữ số đôi một khác
nhau ?

35 / 168
1.4 Các cấu hình tổ hợp đơn giản
1 Chỉnh hợp lặp
I Định nghĩa: một chỉnh hợp lặp chập k của n phần tử là một bộ có thứ
tự gồm k thành phần lấy từ n phần tử đã cho. Các thành phần có thể
được lặp lại. Số chỉnh hợp lặp là nk
I Ví dụ 1: Số xâu nhị phân độ dài n = 2n
Ví dụ 2: Có tất cả có bao nhiêu số có 5 chữ số: = 9.104
2 Chỉnh hợp không lặp
I Định nghĩa: một chỉnh hợp không lặp chập k của n phần tử là một bộ
có thứ tự gồm k thành phần lấy từ n phần tử đã cho. Các thành phần
không được lặp lại. Số chỉnh hợp không lặp là
n(n − 1)(n − 2) . . . (n − k + 1)
I Ví dụ 1: Có bao nhiêu số có 3 chữ số trong đó các chữ số đôi một khác
nhau ? Trả lời: 9 . 9 . 8 = 648
3 Hoán vị
I Định nghĩa: Ta gọi một hoán vị của n phần tử là một cách sắp xếp thứ
tự các phần tử đó. Là trường hợp riêng của chỉnh hợp không lặp khi
n = k. Số hoán vị của n là n!
I Ví dụ: Các hoán vị của (1, 2, 3) là:

35 / 168
1.4 Các cấu hình tổ hợp đơn giản
1 Chỉnh hợp lặp
I Định nghĩa: một chỉnh hợp lặp chập k của n phần tử là một bộ có thứ
tự gồm k thành phần lấy từ n phần tử đã cho. Các thành phần có thể
được lặp lại. Số chỉnh hợp lặp là nk
I Ví dụ 1: Số xâu nhị phân độ dài n = 2n
Ví dụ 2: Có tất cả có bao nhiêu số có 5 chữ số: = 9.104
2 Chỉnh hợp không lặp
I Định nghĩa: một chỉnh hợp không lặp chập k của n phần tử là một bộ
có thứ tự gồm k thành phần lấy từ n phần tử đã cho. Các thành phần
không được lặp lại. Số chỉnh hợp không lặp là
n(n − 1)(n − 2) . . . (n − k + 1)
I Ví dụ 1: Có bao nhiêu số có 3 chữ số trong đó các chữ số đôi một khác
nhau ? Trả lời: 9 . 9 . 8 = 648
3 Hoán vị
I Định nghĩa: Ta gọi một hoán vị của n phần tử là một cách sắp xếp thứ
tự các phần tử đó. Là trường hợp riêng của chỉnh hợp không lặp khi
n = k. Số hoán vị của n là n!
I Ví dụ: Các hoán vị của (1, 2, 3) là: (1, 2, 3),(1, 3, 2),(2, 1, 3),(2, 3,
1),(3, 1, 2),(3, 2, 1)
35 / 168
Các cấu hình tổ hợp đơn giản

4 Tổ hợp
I Định nghĩa: một tổ hợp chập k của n phần tử là một bộ không kể thứ
tự gồm k thành phần khác nhau lấy từ n phần tử đã cho. Nói cách
khác, có thể coi một tổ hợp chập k của n phần tử là một tập con k
n!
phần tử của nó. Số tổ hợp chập k của n phần tử là Cnk = k!(n−k)! , còn
được coi là hệ số tổ hợp
I Ví dụ 1: Có n đội bóng thi đấu vòng tròn 1 lượt, hỏi có bao nhiêu
trận?

36 / 168
Các cấu hình tổ hợp đơn giản

4 Tổ hợp
I Định nghĩa: một tổ hợp chập k của n phần tử là một bộ không kể thứ
tự gồm k thành phần khác nhau lấy từ n phần tử đã cho. Nói cách
khác, có thể coi một tổ hợp chập k của n phần tử là một tập con k
n!
phần tử của nó. Số tổ hợp chập k của n phần tử là Cnk = k!(n−k)! , còn
được coi là hệ số tổ hợp
I Ví dụ 1: Có n đội bóng thi đấu vòng tròn 1 lượt, hỏi có bao nhiêu
trận? Trả lời: n(n − 1)/2
Ví dụ 2: Hỏi có bao nhiêu giao điểm của các đường chéo của một đa
giác lồi n đỉnh (n ≥ 4) nằm trong đa giác nếu biết rằng không có 3
đường nào đồng quy tại 1 điểm trong đa giác.

36 / 168
Các cấu hình tổ hợp đơn giản

4 Tổ hợp
I Định nghĩa: một tổ hợp chập k của n phần tử là một bộ không kể thứ
tự gồm k thành phần khác nhau lấy từ n phần tử đã cho. Nói cách
khác, có thể coi một tổ hợp chập k của n phần tử là một tập con k
n!
phần tử của nó. Số tổ hợp chập k của n phần tử là Cnk = k!(n−k)! , còn
được coi là hệ số tổ hợp
I Ví dụ 1: Có n đội bóng thi đấu vòng tròn 1 lượt, hỏi có bao nhiêu
trận? Trả lời: n(n − 1)/2
Ví dụ 2: Hỏi có bao nhiêu giao điểm của các đường chéo của một đa
giác lồi n đỉnh (n ≥ 4) nằm trong đa giác nếu biết rằng không có 3
đường nào đồng quy tại 1 điểm trong đa giác. Trả lời: Cứ 4 đỉnh lại tạo
ra một giao điểm thỏa mãn đề bài → Số giao điểm là Cn4

36 / 168
Một vài tính chất hệ số tổ hợp:

Cnk = Cnn−k ; Cn0 = Cnn = 1;


k−1
Công thức đệ quy: Cnk = Cn−1 k
+ Cn−1 , voi n > k > 0
→ Tam giác Pascal, Tam giác Sierpinski
Nhị thức Newton: (x + y )n = Cn0 x n + Cn1 x n−1 y + Cn2 x n−2 y 2 + ... + Cnn y n

1 1
+
1 2 1
+ +
1 3 3 1
+ + +
1 4 6 4 1
+ + + +
1 5 10 10 5 1
+ + + + +
1 6 15 20 15 6 1
+ + + + + +
1 7 21 35 35 21 7 1
+ + + + + + +
1 8 28 56 70 56 28 8 1
+ + + + + + + +
1 9 36 84 126 126 84 36 9 1
+ + + + + + + + +
1 10 45 120 210 252 210 120 45 10 1
+ + + + + + + + + +
1 11 55 165 330 462 462 330 165 55 11 1
+ + + + + + + + + + +
1 12 66 220 495 792 924 792 495 220 66 12 1
+ + + + + + + + + + + +
1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
+ + + + + + + + + + + + +
1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
+ + + + + + + + + + + + + +
1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1
+ + + + + + + + + + + + + + +
1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1

37 / 168
BTVN
1 Bài 1. Cho một lưới gồm các ô vuông. Các nút được đánh số từ 0 đến
n theo chiều từ trái sang phải từ từ 0 đến m theo chiều từ dưới lên
trên. Hỏi có bao nhiêu đường đi khác nhau từ nút (0,0) đến nút
(n,m) nếu chỉ cho phép đi trên cạnh các ô vuông theo chiều sang phải
hoặc lên trên?
2 Bài 2. Hỏi có bao nhiêu số có bốn chữ số có thể tạo thành từ các chữ
số 0,1,2,3,4,5 thỏa mãn
I Không có chữ số nào được lặp lại
I Các chữ số được lặp lại
I Các số chẵn trong (a)
3 Bài 3. Có 3 giỏ đựng các quả cầu xanh, đỏ, tím. Mỗi giỏ chỉ đựng các
quả cầu cùng màu và mỗi giỏ chứa ít nhất 8 quả cầu.
I Có bao nhiêu cách chọn ra 8 quả cầu?
I Có bao nhiêu cách chọn 8 quả cầu mà trong đó có ít nhất một quả cầu
đỏ, một quả cầu xanh và 1 quả cầu tím?

38 / 168
Chương 2. Bài toán đếm

1 2.1 Giới thiệu bài toán


2 2.2 Nguyên lý bù trừ
3 2.3 Quy về các bài toán đơn giản
4 2.4 Công thức truy hồi
5 2.5 Phương pháp hàm sinh
6 2.6 Phương pháp liệt kê

39 / 168
2.1 Giới thiệu bài toán

Đếm xem có bao nhiêu cấu hình tổ hợp có thể được tạo ra với những
quy tắc đã cho trước
Thông thường lời giải của bài toán phụ thuộc váo các tham số ban
đầu và người ta cố gắng biểu diễn sự phụ thuộc này bằng các công
thức toán học
Thường đưa về các bài toán quen thuộc, chia thành các lớp nhỏ hơn
và áp dụng các nguyên lý nhân, cộng để đếm số cấu hình

40 / 168
Giới thiệu bài toán

Ví dụ 1: Có bao nhiêu cách xếp 5 người đứng thành 1 hàng ngang


sao cho A không đứng cạnh B.

41 / 168
Giới thiệu bài toán

Ví dụ 1: Có bao nhiêu cách xếp 5 người đứng thành 1 hàng ngang


sao cho A không đứng cạnh B. Trả lời: 5! − 2.4! = 72
Ví dụ 2: Một đợt phát hành xổ số với các vé gồm 2 thành phần: phần
đầu gồm 2 chữ cái hoa (A . . . Z ) và phần sau gồm 4 chữ số lấy từ 0
đến 9. Hỏi xác suất để trúng giải độc đắc là bao nhiêu?

41 / 168
Giới thiệu bài toán

Ví dụ 1: Có bao nhiêu cách xếp 5 người đứng thành 1 hàng ngang


sao cho A không đứng cạnh B. Trả lời: 5! − 2.4! = 72
Ví dụ 2: Một đợt phát hành xổ số với các vé gồm 2 thành phần: phần
đầu gồm 2 chữ cái hoa (A . . . Z ) và phần sau gồm 4 chữ số lấy từ 0
đến 9. Hỏi xác suất để trúng giải độc đắc là bao nhiêu? Trả lời:
1
262 x104
1
= 6760000 = 1, 48.10−7
Ví dụ 3: Thuật toán “nổi bọt” dùng để xếp tăng dần dãy ai
(i = 1 . . . n) được mô tả bằng đoạn chương trình giả code dưới đây.
Hãy đếm xem có bao nhiêu phép so sánh?
for (i = 2; i <= n; i++)
for (j = n; j>=i, j–)
if( a(j-1) > a(j)) Swap(a(j-1), a(j));

41 / 168
Giới thiệu bài toán

Ví dụ 1: Có bao nhiêu cách xếp 5 người đứng thành 1 hàng ngang


sao cho A không đứng cạnh B. Trả lời: 5! − 2.4! = 72
Ví dụ 2: Một đợt phát hành xổ số với các vé gồm 2 thành phần: phần
đầu gồm 2 chữ cái hoa (A . . . Z ) và phần sau gồm 4 chữ số lấy từ 0
đến 9. Hỏi xác suất để trúng giải độc đắc là bao nhiêu? Trả lời:
1
262 x104
1
= 6760000 = 1, 48.10−7
Ví dụ 3: Thuật toán “nổi bọt” dùng để xếp tăng dần dãy ai
(i = 1 . . . n) được mô tả bằng đoạn chương trình giả code dưới đây.
Hãy đếm xem có bao nhiêu phép so sánh?
for (i = 2; i <= n; i++)
for (j = n; j>=i, j–)
if( a(j-1) > a(j)) Swap(a(j-1), a(j));
n(n−1)
Trả lời: (n − 1) + (n − 2) + . . . + 1 = 2

41 / 168
Bài toán chia kẹo
Giả sử k và n là các số nguyên không âm. Hỏi phương trình sau đây có
bao nhiêu nghiệm?
t1 + t2 + . . . + tk = n
t 1 , t 2 , . . . , t k ∈ Z+
Nội dung thực tế:
Cần chia n cái kẹo cho k em bé B1 , B2 , . . . , Bk . Hỏi có bao nhiêu
cách chia khác nhau?
Cần thả n quả bóng giống nhau vào k phòng: Room 1, Room 2, . . . ,
Room k. Hỏi có bao nhiêu cách phân bổ khác nhau?
Nếu gọi tj là số lượng quả bóng thả vào Room j, j = 1, 2, . . . , n; thì vấn
đề đặt ra dẫn về bài toán: Hỏi phương trình sau đây

t1 + t2 + . . . + tk = n
có bao nhiêu nghiệm nguyên không âm?
42 / 168
Giải bài toán chia kẹo

Xét dãy n + k − 1 hộp. Tô k − 1 hộp nào đó bởi màu xám; các hộp
xám này sẽ là vách ngăn: D1 , D2 , Dk−1 .
Ví dụ: với n = 16, k = 6
Thả n quả bóng vào n hộp còn lại, mỗi hộp 1 quả.
Ví dụ, với n=16, k=6
Thả các quả bóng trước vách ngăn D1 vào Room 1, các quả bóng
giữa vách ngăn D1 và D2 vào Room 2, vân vân, và cuối cùng các quả
bóng sau Dk−1 vào Room k.

43 / 168
Giải bài toán chia kẹo

Như vậy, rõ ràng tồn tại tương ứng 1-1 giữa một cách phân bổ các
quả bóng và một cách chọn k − 1 hộp trong số n + k − 1 hộp làm
vách ngăn.
k−1
Do có tất cả Cn+k−1 cách chọn k − 1 hộp từ n + k − 1 hộp, nên đó
cũng chính là số cách phân bổ n quả bóng vào k phòng, cũng chính
là số cách chia n cái kẹo cho k em bé và cũng chính là số nghiệm
nguyên không âm của phương trình:

t1 + t2 + . . . + tk = n

44 / 168
Giải bài toán chia kẹo

Bài toán chia kẹo 2. Có bao nhiêu cách chia n cái kẹo cho k em bé mà
trong đó mỗi em được ít nhất một cái? Hay tương đương: Hỏi phương
trình sau đây :
t1 + t2 + . . . + tk = n
có bao nhiêu nghiệm nguyên dương?

45 / 168
Giải bài toán chia kẹo

Bài toán chia kẹo 2. Có bao nhiêu cách chia n cái kẹo cho k em bé mà
trong đó mỗi em được ít nhất một cái? Hay tương đương: Hỏi phương
trình sau đây :
t1 + t2 + . . . + tk = n
có bao nhiêu nghiệm nguyên dương?
Trước hết chia cho mỗi em 1 cái kẹo, n − k cái kẹo còn lại sẽ được chia
cho k em bé. Bài toán dẫn về: Hỏi có bao nhiêu cách chia n − k cái kẹo
cho k em bé. Sử dụng kết quả bài trước, ta có đáp số cần tìm là:
k−1
Cn−1

45 / 168
2.2 Nguyên lý bù trừ

N(A ∪ B) = N(A) + N(B) − N(A ∩ B)


Mở rộng: N(A1 ∪ A2 ∪ . . . ∪ Am ) = N1 − N2 + . . . + (−1)m−1 Nm
Nk là tổng số phần tử của tất cả các giao của k tập lấy từ m tập.
Ghi chú: số giao của k tập lấy từ m tập bằng Cmk

46 / 168
Bây giờ đồng nhất tập Ak với tính chất Ak cho trên một tập X nào
đó và đếm xem có bao nhiêu phần tử của X không thỏa mãn một
tính chất Ak nào cả. Gọi N̄ là số cần đếm, N là số phần tử của X .
Theo công thức đối ngẫu ta có:
N̄ = N(A¯1 ∩ A¯2 ∩ . . . ∩ A¯m ) = N(A1 ∪ A2 ∪ . . . ∪ Am )
= N − N(A1 ∪ A2 ∪ . . . ∪ Am )

47 / 168
Bây giờ đồng nhất tập Ak với tính chất Ak cho trên một tập X nào
đó và đếm xem có bao nhiêu phần tử của X không thỏa mãn một
tính chất Ak nào cả. Gọi N̄ là số cần đếm, N là số phần tử của X .
Theo công thức đối ngẫu ta có:
N̄ = N(A¯1 ∩ A¯2 ∩ . . . ∩ A¯m ) = N(A1 ∪ A2 ∪ . . . ∪ Am )
= N − N(A1 ∪ A2 ∪ . . . ∪ Am )
N̄ = N − N1 + N2 − . . . + (−1)m Nm , NGUYÊN LÝ BÙ TRỪ,
Nk là tổng các phần tử của X thỏa mãn k tính chất lấy từ m tính
chất đã cho

47 / 168
Ví dụ

1 Trong cuộc thi học kỳ, lớp 10A có 20 bạn được 10 điểm một trong
hai môn toán và tin. Số bạn được 10 điểm môn toán là 15 và số bạn
được 10 điểm môn tin là 12. Hỏi số bạn được 10 điểm của cả 2 môn
là bao nhiêu?

48 / 168
Ví dụ

1 Trong cuộc thi học kỳ, lớp 10A có 20 bạn được 10 điểm một trong
hai môn toán và tin. Số bạn được 10 điểm môn toán là 15 và số bạn
được 10 điểm môn tin là 12. Hỏi số bạn được 10 điểm của cả 2 môn
là bao nhiêu? Trả lời: 15+12 - 20 = 7
2 Hỏi trong các số nguyên từ 1 đến 1000 có tất cả bao nhiêu số không
chia hết cho bất cứ số nào trong 3 số 3, 4, 7?

48 / 168
Ví dụ

1 Trong cuộc thi học kỳ, lớp 10A có 20 bạn được 10 điểm một trong
hai môn toán và tin. Số bạn được 10 điểm môn toán là 15 và số bạn
được 10 điểm môn tin là 12. Hỏi số bạn được 10 điểm của cả 2 môn
là bao nhiêu? Trả lời: 15+12 - 20 = 7
2 Hỏi trong các số nguyên từ 1 đến 1000 có tất cả bao nhiêu số không
chia hết cho bất cứ số nào trong 3 số 3, 4, 7? Trả lời:
N(X ) − N(A3 ∪ A4 ∪ A7 ), Ai là tập các số từ 1 đến 1000 chia hết cho
i; X là tập các số nguyên từ 1 đến 1000

48 / 168
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 suất để xảy ra không một lá thư nào bỏ đúng địa
chỉ là bao nhiêu?

49 / 168
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 suất để xảy ra không một lá thư nào bỏ đúng địa
chỉ là bao nhiêu? Trả lời:
X - tập hợp tất cả các cách bỏ thư,
Ak - tính chất lá thư thứ k bỏ đúng địa chỉ,
N̄ = N − N1 + N2 − . . . + (−1)n Nn , trong đó:
I N̄ = Dn :là số cần tìm, còn gọi là số mất thứ tự,
I N = n!,
I Nk : số tất cả các cách bỏ thư sao cho có k lá thư xác định được bỏ
đúng địa chỉ. Có Cnk cách chọn ra k lá thư để bỏ đúng địa chỉ, sau đó
n!
có (n − k)! cách bỏ các lá thư còn lại. Vậy Nk = Cnk .(n − k)! = k! ;

Xác suất cần tìm là SX = N
1 1 1
= 1 − 1! + 2! − . . . + (−1)n n! = Hn

49 / 168
2.3 Quy về các bài toán đơn giản

Quy bài toán đang xét về các bài toán đơn giản hơn ⇒ Giải quyết
từng bài toán con trước khi gộp lại bài toán lớn
Có thể quy được hay không còn phụ thuộc vào đặc thù bài toán
Đòi hỏi một sự phân tích sâu sắc cấu hình cần đếm

50 / 168
Bài toán xếp khách của Lucas:
Có một bàn tròn, xung quanh có 2n chiếc ghế. Cần sắp xếp chỗ cho n cặp vợ
chồng sao cho các ông chồng ngồi xen kẽ các bà vợ và không có cặp vợ chồng
nào ngồi cạnh nhau.

51 / 168
Bài toán xếp khách của Lucas:
Có một bàn tròn, xung quanh có 2n chiếc ghế. Cần sắp xếp chỗ cho n cặp vợ
chồng sao cho các ông chồng ngồi xen kẽ các bà vợ và không có cặp vợ chồng
nào ngồi cạnh nhau.
Số cách xếp: Mn = 2n! · Un
I Số các xếp các bà: 2n!;
I Un : số cách xếp các ông tương ứng với 1 cách xếp các bà
⇒ Đếm số Un ?
Đánh số các bà từ 1 đến n, tương ứng là số các ông chồng;
Đánh số các ghế trống: ghế số i nằm giữa bà i và bà i + 1.
Mỗi cách xếp các ông biểu diễn bằng 1 phép thế φ, φ(i) = j trên tập
{1, 2, . . . , n} ⇒ φ(i) 6= i và φ(i) 6= i + 1 ⇒ Un (số phân bố) là số tất cả
các phép thế φ như vậy.
P(i) - tính chất φ(i) = i; Q(i) - tính chất φ(i) = i + 1;
Đặt Pn+i = Qi ⇒ 2n tính chất Pi .
Un = N̄ = n! − N1 + N2 − . . ., Nk là tổng số tất cả các phép thế thỏa mãn
k tính chất.
51 / 168
Gọi g (2n, k) - số cách lấy k tính chất từ 2n tính chất sao cho Pi và Qi hoặc
Pi+1 và Qi không đồng thời có mặt ⇒ Nk = g (2n, k) · (n − k)!
⇒ Tính g (2n, k)?
Xếp 2n tính chất đang xét thành một vòng tròn theo thứ tự
P1 , Q1 , P2 , Q2 , . . . , Pn , Qn ⇒ g (2n, k) là số cách lấy ra k phần tử trong 2n
phần tử xếp thành vòng tròn sao cho không có 2 phần tử nào kề nhau cùng
được lấy ra. Quy về giải hai bài toán con sau:
1 Có bao nhiêu cách lấy ra k phần tử trong n phần tử xếp trên một
đường thẳng sao cho không có 2 phần tử kề nhau được lấy ra?
2 Giống như bài toán 1 nhưng các phần tử xếp trên 1 vòng tròn.

52 / 168
BTVN
1 Hỏi có bao nhiêu xâu tam phân độ dài n không chứa 6 số 0 liền nhau?
2 Hỏi có bao nhiêu số nguyên dương nhỏ hơn 10000 chia hết cho 7
nhưng không chia hết cho 5 và 2?
3 Có bao nhiêu hoán vị của các số tự nhiên 1,2,. . . ,10 mà trong đó 3 số
1,2,3 không đứng cạnh nhau theo thứ tự tăng dần?
4 Hỏi phương trình x1 + x2 + x3 + x4 = 29 có bao nhiêu nghiệm nguyên
không âm thỏa mãn x1 ≤ 3, x2 ≤ 12, x3 ≤ 5, x4 ≤ 10.
5 Có bao nhiêu xâu nhị phân không có k số 0 liên tiếp? Khảo sát, đánh
giá, kết luận kết quả tìm được.
6 Có bao nhiêu cách xếp m số 0 và n số 1 thành một vòng tròn?

53 / 168
2.4 Công thức truy hồi

Trong nhiều bài toán, việc tìm ra công thức đếm trực tiếp theo tham
số đầu vào n là rất khó trong khi đó công thức liên hệ giữa kết quả
đếm tương ứng và các kết quả đếm tương ứng với các giá trị bé hơn
n lại đơn giản và dễ tìm
Nhờ công thức này và một vài giá trị ban đầu ta có thể tính mọi giá
trị còn lại khác → Công thức truy hồi hay Công thức đệ quy
Do tính kế thừa, công thức truy hồi rất thích hợp với việc lập trình
trên máy tính. Nó cho phép giảm đáng kể độ phức tạp cũng như gia
tăng độ ổn định của quá trình tính toán

54 / 168
2.4.1 Một số bài toán
Tính số mất thứ tự Dn
Một mất thứ tự là một hoán vị (a1 , a2 , . . . an ) trong đó ai 6= i, ∀i.

55 / 168
2.4.1 Một số bài toán
Tính số mất thứ tự Dn
Một mất thứ tự là một hoán vị (a1 , a2 , . . . an ) trong đó ai 6= i, ∀i. a1 có
thể nhận n − 1 giá trị ngoài 1. Với mọi giá trị k 6= 1 của a1 ta xét 2 trường
hợp:
1 ak = 1, các thành phần còn lại (6= a1 , ak ) được xác định như một
mất thứ tự của n − 2 phần tử → số các mất thứ tự là Dn−2
2 ak 6= 1, các thành phần từ 2 đến n được xác định như một mất thứ
tự của n − 1 phần tử → số các mất thứ tự là Dn−1
→ công thức truy hồi (n > 3): Dn = (n − 1)(Dn−2 + Dn−1 )
D1 = 0; D2 = 1
Giải công thức truy hồi: Đặt Vn = Dn − nDn−1 ,
Vn = −Vn−1 = Vn−2 = ... = (−1)n−2 V2 = (−1)n
Dn−1 n
→ Dn!n − (n−1)! = (−1)
n! , cộng các hệ thức với nhau với n = 1, 2, . . .:
Dn 1 1 (−1)n
n! =1− 1! + 2! − ... + n!

55 / 168
Chia mặt phẳng
Trên mặt phẳng kẻ n đường thẳng sao cho không có hai đường thẳng nào
song song và 3 đường thẳng nào đồng quy. Hỏi mặt phẳng được chia
thành mấy phần?

56 / 168
Chia mặt phẳng
Trên mặt phẳng kẻ n đường thẳng sao cho không có hai đường thẳng nào
song song và 3 đường thẳng nào đồng quy. Hỏi mặt phẳng được chia
thành mấy phần? Giải: Gọi Sn là số mặt phẳng được chia ra bởi n đường
thẳng. Giả sử đã kẻ n − 1 đường thẳng, kẻ thêm đường thẳng thứ n, số
phần được thêm bằng số giao điểm tạo ra cộng 1 = n,
→ Sn = Sn−1 + n; S0 = 1 → Sn = 1 + n(n+1)2

Tính hệ số tổ hợp Cnk

56 / 168
Chia mặt phẳng
Trên mặt phẳng kẻ n đường thẳng sao cho không có hai đường thẳng nào
song song và 3 đường thẳng nào đồng quy. Hỏi mặt phẳng được chia
thành mấy phần? Giải: Gọi Sn là số mặt phẳng được chia ra bởi n đường
thẳng. Giả sử đã kẻ n − 1 đường thẳng, kẻ thêm đường thẳng thứ n, số
phần được thêm bằng số giao điểm tạo ra cộng 1 = n,
→ Sn = Sn−1 + n; S0 = 1 → Sn = 1 + n(n+1)2

Tính hệ số tổ hợp Cnk


Giải: Chọn phần tử cố định a trong tập đang xét. Chia số cách chọn tập k
phần tử này thành 2 lớp: chứa a và không chứa a. Nếu a được chọn thì ta
phải bổ sung k − 1 phần tử từ n − 1 phần tử còn lại, từ đó lớp chứa a gồm
k−1
Cn−1 cách. Nếu a không được chọn thì ta phải chọn k phần tử từ n − 1
k k−1
phần tử còn lại, từ đó lớp không chứa a gồm Cn−1 → Cnk = Cn−1 k
+ Cn−1

56 / 168
Bài toán tháp Hà NộiClick here
Có 3 cọc A,B, C và n đĩa theo thứ tự to đến nhỏ xếp trên cọc A. Chuyển
chồng đĩa từ A sang C với điều kiện không được phép xếp đĩa to trên đĩa
nhỏ. Tính số lượng bước chuyển ít nhất.

57 / 168
Bài toán tháp Hà NộiClick here
Có 3 cọc A,B, C và n đĩa theo thứ tự to đến nhỏ xếp trên cọc A. Chuyển
chồng đĩa từ A sang C với điều kiện không được phép xếp đĩa to trên đĩa
nhỏ. Tính số lượng bước chuyển ít nhất. Giải: Gọi hn là số phép chuyển.
Việc chuyển đĩa bao gồm các bước sau:
Chuyển n − 1 đĩa từ A sang B sử dụng C làm trung gian
Chuyển 1 đĩa từ A sang C
Chuyển n − 1 đĩa từ B sang C sử dụng A làm trung gian
→ hn = 2hn−1 + 1

57 / 168
BTVN
1 Xây dựng công thức đệ qui cho Qn là số lượng cách phủ lưới ô vuông
kích thước 2 × n bằng các quân bài domino.
2 Xây dựng công thức đệ qui cho fn là số chỉnh hợp lặp chập n từ hai
phần tử 0, 1 (cũng chính là xâu nhị phân độ dài n) không chứa hai số
0 liền nhau.
3 Xây dựng công thức đệ qui cho fn là số chỉnh hợp lặp chập n từ hai
phần tử 0, 1 (cũng chính là xâu nhị phân độ dài n) không chứa k số
0 liền nhau.

58 / 168
2.4.2 Giải công thức truy hồi tuyến tính hệ số hằng

Công thức truy hồi bậc k


an = c1 an−1 + c2 an−2 + · · · + ck an−k
c1 , c2 , . . . , ck là các hằng số, ck 6= 0.
Dãy số {an }, gọi là nghiệm, sẽ được xác định duy nhất nếu thỏa
mãn k điều kiện đầu:
a0 = C0 , a1 = C1 , . . . , ak−1 = Ck−1 ,
C0 , C1 , . . . , Ck−1 là các hằng số. Ta tìm nghiệm dưới dạng
an = r n , r là hằng số
⇒ r là nghiệm của phương trình:
r n = c1 r n−1 + c2 r n−2 + · · · + ck r n−k

Phương trình đặc trưng:


r n − c1 r n−1 − c2 r n−2 − · · · − ck r n−k = 0

59 / 168
Định lý 1
Giả sử phương trình r 2 − c1 r − c2 = 0 có 2 nghiệm phân biệt r1 và r2 , với
c1 , c2 là các hằng số thực. Khi đó dãy số {an } là nghiệm của công thức
truy hồi
an = c1 an−1 + c2 an−2
khi và chỉ khi
an = α1 r1n + α2 r2n ,
n = 0, 1, . . . , trong đó α1 , α2 là các hằng số.

60 / 168
Dãy Fibonacci Click here

(
0 if n = 0
f (n) = 1 if n = 1
f (n − 1) + f (n − 2) if n ≥ 2

61 / 168
Biểu diễn nốt nhạc: C, D, E, F, G, A, B

1 ↔ C, 2 ↔ D, 3 ↔ E, 4 ↔ F, 5 ↔ G, 6 ↔ A, 7 ↔ B, 8 ↔ C, . . .

Điệu VALSE FIBONACCI

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, . . .


CDEGCABAAGFDACBCCDEGCABAAGFDACBCCDE
G C A B A A G F D A C B C. . . Click here

62 / 168
Fn = Fn−1 + Fn−2 , n ≥ 2, F0 = F1 = 1.

63 / 168
Fn = Fn−1 + Fn−2 , n ≥ 2, F0 = F1 = 1.
Giải phương trình đặc trưng:
r2 −
√ r − 1 = 0√
⇒ r1 = 2 , r2 = 1−2 5
1+ 5

⇒ Fn = α1 (r1 )n + α2 (r2 )n
√ !n+1 √ !n+1
 
1  1+ 5 1− 5
Fn = √ − 
5 2 2

Công thức dùng các phép toán vô tỷ để biểu diễn một giá trị nguyên
:-)

63 / 168
Định lý 1 không áp dụng được khi phương trình đặc trưng có nghiệm kép!

Định lý 2
Giả sử phương trình r 2 − c1 r − c2 = 0 có nghiệm kép r0 , với c1 , c2 là các
hằng số thực, c2 6= 0. Khi đó dãy số {an } là nghiệm của công thức truy hồi
an = c1 an−1 + c2 an−2
khi và chỉ khi
an = α1 r0n + α2 nr0n ,
n = 0, 1, . . . , trong đó α1 , α2 là các hằng số.

64 / 168
Ví dụ
Tìm nghiệm cho công thức truy hồi
an = 6an−1 − 9an−2
với điều kiện đầu a0 = 1 và a1 = 6.

65 / 168
Ví dụ
Tìm nghiệm cho công thức truy hồi
an = 6an−1 − 9an−2
với điều kiện đầu a0 = 1 và a1 = 6.
Giải phương trình đặc trưng:
r 2 − 6r + 9 = 0
có nghiệm kép r = 3. Do đó nghiệm của hệ thức có dạng:
an = α1 3n + α2 n3n
Sử dụng điều kiện đầu để giải ta được:

an = 3n + n3n

65 / 168
Định lý 3
Giả sử phương trình đặc trưng
r k − c1 r k−1 − c2 r k−2 − . . . − ck = 0
có k nghiệm phân biệt r1 , r2 , . . . , rk , với c1 , c2 , . . . ck là các hằng số thực.
Khi đó dãy số {an } là nghiệm của công thức truy hồi
an = c1 an−1 + c2 an−2 + · · · + ck an−k ,
khi và chỉ khi
an = α1 r1n + α2 r2n + · · · + αk rkn ,
n = 0, 1, . . . , trong đó α1 , α2 , . . . , αk là các hằng số.

66 / 168
Ví dụ
Tìm nghiệm cho công thức truy hồi
an = 6an−1 − 11an−2 + 6an−3
với điều kiện đầu a0 = 2, a1 = 5, a2 = 15.

67 / 168
Ví dụ
Tìm nghiệm cho công thức truy hồi
an = 6an−1 − 11an−2 + 6an−3
với điều kiện đầu a0 = 2, a1 = 5, a2 = 15.
Giải phương trình đặc trưng:
r 3 − 6r 2 + 11r − 6 = 0
có 3 nghiệm r1 = 1, r2 = 2, r3 = 3. Do đó nghiệm của hệ thức có
dạng:
an = α1 1n + α2 2n + α3 3n
Sử dụng điều kiện đầu để giải ta được:

an = 1 − 2n + 2 · 3n

Chú ý:
Giải một phương trình bậc k không phải lúc nào cũng làm được với k ≥ 5.

67 / 168
2.5 Phương pháp hàm sinh
2.5.0 Giới thiệu phương pháp Hàm sinh - Generating function

Ý tưởng:
Giả sử ta phải tính một dãy các số S(x) phụ thuộc vào n, với
n = 0, . . . , ∞, được cho bởi một quy tắc truy hồi hay tổ hợp nào đó.
Hàm F (x) = Σn S(n)x n gọi là hàm sinh.
Thay vì tính S(n) cho từng n, ta tính luôn xem hàm F (x) là hàm
nào, nếu tính được, ta lấy đạo hàm của nó tại điểm 0 là ra được các
số S(n).

68 / 168
Ví dụ hàm sinh với công thức đệ quy
Dãy Fibonacci an = an−1 + an−2 với a0 = a1 = 1
Cách 1: sử dụng phương pháp giải công thức truy hồi tuyến tính hệ
số hằng ⇒ an = C .An + D.B n với A, B, C , D là các số nào đó.
Cách 2: sử dụng hàm sinh. Đặt F (x) = Σan x n . Khi đó

F (x) = 1 + Σan+1 x n+1 = 1 + Σan−1 x n+1 + Σan x n+1

= 1 + F (x)x + F (x)x 2
suy ra F (x)(1 − x − x 2 ) = 1, hay

1 1 C D
F (x) = 2
= = +
1−x −x (1 − Ax)(1 − Bx) 1 − Ax 1 − Bx

= C .Σ(Ax)n + D.Σ(Bx)n
Vậy an = C .An + D.B n .

69 / 168
2.5 Phương pháp hàm sinh
2.5.1 Hàm sinh và bài toán đếm

Xét trên dãy vô hạn {hn |n = 0, 1, 2, . . .}!


Biến dãy hữu hạn h0 , h1 , . . . , hm thành dãy vô hạn bằng cách đặt
hi = 0, i > m.

Định nghĩa
Hàm sinh g (x) của dãy số {hn |n = 0, 1, 2, . . .} là chuỗi vô hạn:
g (x) = h0 + h1 x + h2 x 2 + . . . = Σ∞ i=0 hi x
i

g (x) sinh ra dãy số đã cho như là dãy các hệ số của nó;


nếu là dãy hữu hạn thì g (x) là một đa thức bậc m.

Ví dụ 1
g (x) = (1 + x)m

70 / 168
2.5 Phương pháp hàm sinh
2.5.1 Hàm sinh và bài toán đếm

Xét trên dãy vô hạn {hn |n = 0, 1, 2, . . .}!


Biến dãy hữu hạn h0 , h1 , . . . , hm thành dãy vô hạn bằng cách đặt
hi = 0, i > m.

Định nghĩa
Hàm sinh g (x) của dãy số {hn |n = 0, 1, 2, . . .} là chuỗi vô hạn:
g (x) = h0 + h1 x + h2 x 2 + . . . = Σ∞ i=0 hi x
i

g (x) sinh ra dãy số đã cho như là dãy các hệ số của nó;


nếu là dãy hữu hạn thì g (x) là một đa thức bậc m.

Ví dụ 1
g (x) = (1 + x)m = Σm k k
k=0 Cm x
sinh ra dãy các hệ số tổ hợp {hk = Cmk , k = 0, 1, . . . , m}
70 / 168
Ví dụ 2
g (x) = 1/(1 − x)

71 / 168
Ví dụ 2
g (x) = 1/(1 − x) = 1 + x + x 2 + . . .
sinh ra dãy
1, 1, 1, . . .

Ví dụ 3: Tổ hợp lặp
Có bao nhiêu cách chọn n vật từ k loại đồ vật?

71 / 168
Ví dụ 2
g (x) = 1/(1 − x) = 1 + x + x 2 + . . .
sinh ra dãy
1, 1, 1, . . .

Ví dụ 3: Tổ hợp lặp
Có bao nhiêu cách chọn n vật từ k loại đồ vật?
Số lượng đồ vật chọn một loại tương ứng với số mũ trong phương trình
(1 + x + x 2 + . . .).
g (x) = 1/(1 − x)k

71 / 168
Ví dụ 2
g (x) = 1/(1 − x) = 1 + x + x 2 + . . .
sinh ra dãy
1, 1, 1, . . .

Ví dụ 3: Tổ hợp lặp
Có bao nhiêu cách chọn n vật từ k loại đồ vật?
Số lượng đồ vật chọn một loại tương ứng với số mũ trong phương trình
(1 + x + x 2 + . . .).
g (x) = 1/(1 − x)k = (1 + x + x 2 + . . .)k
sinh ra dãy
n
{Cn+k−1 : n = 0, 1, 2, . . .}
Số lần xuất hiện số hạng x n sẽ bằng số nghiệm nguyên không âm của
phương trình
n
t1 + t2 + . . . + tk = n = Cn+k−1
Có bao nhiêu cách chọn n bông hoa từ 3 bông cúc, 2 bông layơn và 4
bông hồng?
71 / 168
Số cách chọn = số nghiệm nguyên không âm của phương trình
n = a + b + c, với 0 ≤ a ≤ 3, 0 ≤ b ≤ 2, 0 ≤ c ≤ 4;
và là hệ số của x n trong khai triển hàm

g (x) = (1 + x + x 2 + x 3 )(1 + x + x 2 )(1 + x + x 2 + x 3 + x 4 )

Có thể dùng phương pháp liệt kê để tính các hệ số h0 , h1 , . . . , h9 , hk = 0


với k > 9

72 / 168
Một số khai triển đại số hay sử dụng

x k /(1 − x) = x k (1 + x + x 2 + x 3 + . . .) = x k + x k+1 + x k+2 + . . .

(1 − x k+1 )/(1 − x) = 1 + x + x 2 + . . . + x k

1/(1 − x 2 ) = 1 + x 2 + x 4 + x 6 + . . .

x/(1 − x 2 ) = x + x 3 + x 5 + . . .

Ví dụ 4
Có bao nhiêu cách chọn ra n quả từ 4 loại quả: táo, chuối, cam và đào
(mỗi loại đều có số lượng ít nhất là n) mà trong đó có một số chẵn quả
táo, số lẻ quả chuối, không quá 4 quả cam và ít ra 2 quả đào?

73 / 168
Hàm sinh để giải bài toán này là

g (x) = (1+x 2 +x 4 +x 6 +. . .)(x 3 +x 5 +x 7 . . .)(1+x+x 2 +x 3 +x 4 )(x 2 +x 3 +x 4 +.

1 x (1 − x 5 ) x 2 x 3 (1 − x 5 )
= =
(1 − x 2 ) (1 − x 2 ) (1 − x) (1 − x) (1 − x 2 )2 (1 − x)2
Số cách đếm là hệ số thứ n trong triển khai g (x) dưới dạng chuỗi lũy thừa
⇒ Lập trình.

74 / 168
2.6 Phương pháp liệt kê

Rất nhiều bài toán đếm chưa có lời giải dưới dạng một công thức ⇒
Phương pháp liệt kê.
Liệt kê tất cả các cấu hình cần đếm.
Lập trình cho máy tính nhờ máy tính đếm hộ.

75 / 168
Hình chữ nhật la tinh

Giả sử S là một n-tập, giả thiết là tập {1, 2, . . . , n}. Một hình chữ nhật
la tinh trên S là một bảng p dòng, q cột, (p, q ≤ n) sao cho mỗi dòng là
một chỉnh hợp không lặp chập q của S và mỗi cột là một chỉnh hợp
không lặp chập p của S.

Hình chữ nhật la tinh chuẩn


q = n;
Không có một cột nào được chứa phần tử lặp lại;
Dòng đầu là hoán vị 1, 2, . . . , n;
Ví dụ là một hình chữ nhật la tinh chuẩn trên tập
S = {1, 2, 3, 4, 5, 6, 7}:
1234567
4127635
6715243

76 / 168
L(p, n) = n!K (p, n)
L(p, n) là số hình chữ nhật la tinh p × n;
K (p, n) là số hình chữ nhật la tinh chuẩn p × n;
Số mất thứ tự Dn là số các hình chữ nhật la tinh chuẩn 2 × n;
Số phân bố Un là số các hình chữ nhật la tinh chuẩn 3 × n, với 2
dòng đầu là
1 2 3 ... n − 1 n
2 3 4 ... n 1

Riordan J. (1946)
K (3, n) = Σm k
k=0 Cn · Dn−k · Dk · Un−2k
trong đó m = [n/2], U0 = 1.
Bài toán đếm số hình chữ nhật la tinh với số dòng nhiều hơn cho đến
nay chưa được giải quyết. Người ta mới chỉ đưa ra một vài dạng tiệm
cận của L(p, n)

77 / 168
Hình vuông la tinh chuẩn
p = q = n;
Dòng đầu và cột đầu là hoán vị 1, 2, . . . , n;
Ví dụ hình vuông la tinh chuẩn cấp 7:
1234567
2345671
3456712
4567123
5671234
6712345
7123456

L(n, n) = n!(n − 1)!`n


`n là số hình vuông la tinh chuẩn cấp n.
n 1 2 3 4 5 6 7
`n 1 1 1 4 56 9408 16942080
78 / 168
Chương 3. Bài toán liệt kê

1 3.1 Giới thiệu bài toán


2 3.2 Thuật toán và độ phức tạp thuật toán
3 3.3 Thuật toán quay lui
4 3.4 Phương pháp sinh

79 / 168
3.1 Giới thiệu bài toán

Ngoài việc đếm số cấu hình tổ hợp (Bài toán đếm), nhiều tổ hợp cần
chỉ rõ các cấu hình tổ hợp đó là những cấu hình tổ hợp nào
Bài toán liệt kê tổ hợp: là bài toán đưa ra danh sách tất cả các cấu
hình tổ hợp có thể có → bài toán liệt kê cần xác định một thuật toán
để theo đó có thể lần lượt xây dựng được tất cả các cấu hình đáng
quan tâm
Đảm bảo 2 nguyên tắc:
I không bỏ sót cấu hình
I không lặp lại cấu hình
Khó khăn chính của phương pháp này là sự bùng nổ tổ hợp

80 / 168
3.2 Thuật toán và độ phức tạp tính toán

3.2.1 Khái niệm thuật toán (Algorithm)


Đầu tiên thuật toán được hiểu như là các qui tắc thực hiện các phép
tính số học với các con số được viết trong hệ thập phân. Dần dần
khái niệm thuật toán được hiểu rộng hơn và chính xác hơn
Định nghĩa: thuật toán giải một bài toán đặt ra là một thủ tục xác
định bao gồm một dãy hữa hạn các bước cần thực hiện để thu được
lời giải của bài toán

81 / 168
Các đặc trưng của thuật toán
Dữ liệu vào (Input): thuật toán nhận dữ liệu vào từ một nguồn nào
đó: tệp, ngẫu nhiên, bàn phím,. . .
Kết quả ra (Output): với một tập các dữ liệu đầu vào, thuật toán
đưa ra các dữ liệu tương ứng với lời giải của bài toán
Chính xác (Precision): các bước của thuật toán cần được mô tả
chính xác
Hữu hạn (Finiteness): thuật toán cần phải đưa được kết quả ra sau
một số hữu hạn (có thể rất lớn) bước với mỗi bộ dữ liệu vào
Đơn trị (Uniqueness): các kết quả trung gian của từng bước thực
hiện thuật toán được xác định một các đơn trị và chỉ phụ thuộc vào
bộ dữ liệu vào và các kết quả của các bước trước
Tổng quát (Generality): thuật toán có thể áp dụng để giải mọi bài
toán có dạng đã cho

82 / 168
INSERTION-SORT(A)
1. for j ← 2 to length[A] do
2. key ← A[j]
3. Insert A[j] into the sorted sequence A[1 . . . j − 1].
4. i ←j −1
5. while i > 0 and A[i] > key do
6. A[i + 1] ← A[i]
7. i ←i −1
8. A[i + 1] ← key

83 / 168
Ví dụ: Cho 3 số nguyên a, b, c. Mô tả thuật toán tìm số lớn nhất
trong 3 số đã cho

84 / 168
Ví dụ: Cho 3 số nguyên a, b, c. Mô tả thuật toán tìm số lớn nhất
trong 3 số đã cho
Bước 1: Nếu a ≥ b thì
I Bước 2: Nếu a ≥ c thì a là số lớn nhất
I Bước 3: Nếu không, c là số lớn nhất
Buoc 4: Nếu không,
I Bước 5: Nếu b ≥ c thì b là số lớn nhất
I Bước 6: Nếu không, c là số lớn nhất

84 / 168
3.2.2 Độ phức tạp thuật toán

Một chương trình máy tính dù được cài đặt theo một thuật toán đúng
nhưng có thể không cho kết quả như mong muốn vì đòi hỏi quá nhiều thời
gian tính, không đủ bộ nhớ để lưu trữ dữ liệu và các biến chương trình.

Phân tích thuật toán


Là quá trình tìm ra những đánh giá về thời gian tính cũng như về dung
lượng bộ nhớ cần thiết để thực hiện thuật toán.

Độ phức tạp thuật toán của một thuật toán


Là thời gian và bộ nhớ cần thiết để thực hiện thuật toán, được biểu diễn
bởi một hàm số học.

85 / 168
Thời gian tính của thuật toán
Là tổng số câu lệnh nó phải thực hiện tính theo kích thước đầu vào.
1 Thời gian tính tốt nhất của thuật toán: Thời gian tối thiểu cần thiết để
thực hiện thuật toán với mọi bộ dữ liệu đầu vào kích thước n.
2 Thời gian tính tồi nhất của thuật toán: Thời gian nhiều nhất cần thiết để
thực hiện thuật toán với mọi bộ dữ liệu đầu vào kích thước n.
3 Thời gian tính trung bình của thuật toán: Thời gian trung bình cần thiết
để thực hiện thuật toán với mọi bộ dữ liệu đầu vào kích thước n.

86 / 168
Rất khó đưa ra được hàm chính xác của thời gian tính:
hàm quá phức tạp;
đòi hỏi quá nhiều sự tính toán chi tiết, chính xác.
⇒ chỉ cần quan tâm đến hàm đơn giản hơn mà cùng thời gian tính.

87 / 168
Ví dụ:
n f (n) = 60n2 + 9n + 9 60n2
10 9099 6000
100 600909 600000
1000 60009009 60000000
10000 6000090009 6000000000

f (n) cùng tốc độ tăng với 60n2 , cùng tốc độ tăng với n2 :
chỉ cần quan tâm đến số hạng trội (60n2 ), và có thể bỏ qua các hằng
số (60);
f (n) có bậc là n2 .
Ta viết: f (n) = Θ(n2 )

88 / 168
Định nghĩa
Giả sử f và g là các hàm đối số nguyên dương:
f (n) = O(g (n)) có nghĩa là C1 · g (n) là cận trên của f (n) với C1 , N1 là các
số nguyên dương sao cho |f (n)| ≤ C1 |g (n)|, ∀n ≥ N1 .
f (n) = Ω(g (n)) có nghĩa là C2 · g (n) là cận dưới của f (n) với C2 , N2 là các
số nguyên dương sao cho |f (n)| ≥ C2 |g (n)|, ∀n ≥ N2 .
f (n) = Θ(g (n)) có nghĩa là f (n) = O(g (n)) và f (n) = Ω(g (n)).
⇒ Định nghĩa bậc của thời gian tính tốt nhất, tồi nhất và trung bình của thuật
toán, và thường được đánh giá qua ký hiệu O-lớn.

89 / 168
Các đánh giá thông dụng:
Dạng đánh giá Tên gọi
Θ(1) Hằng số
Θ(lg lg n) Log log
Θ(lg n) Logarithm
Θ(n) Tuyến tính
Θ(n lg n) n log n
2
Θ(n ) Bậc 2
3
Θ(n ) Bậc 3
m
Θ(n ), m - hằng số Đa thức
Θ(mn ), m ≥ 2 Hàm mũ
Θ(n!) Giai thừa

90 / 168
Thời gian tính với các đánh giá khác nhau:
(giả thiết mỗi bước lặp đòi hỏi 1 micro giây)

Đánh giá n 6 12 50 100


1 10−6 s 10−6 s 10−6 s 10−6 s
lg lg n −6
10 s 2 × 10−6 s 2 × 10−6 s 3 × 10−6 s
lg n 3 × 10−6 s 4 × 10−6 s 6 × 10−6 s 7 × 10−6 s
n 6 × 10−6 s 10−5 s 5 × 10−5 s 10−4 s
n lg n 2 × 10−5 s 4 × 10−5 s 3 × 10−4 s 7 × 10−4 s
n2 4 × 10−5 s 10−4 s 3 × 10−3 s 0.01 s
n3 2 × 10−4 s 2 × 10−3 s 0.13 s 1s
2n 6 × 10−5 s 4 × 10−3 s 36 năm 4 × 106 năm

91 / 168
Phân tích thời gian tính khấu trừ (Amortized time

Thời gian tính khấu trừ là thời gian tính trung bình toàn bộ thuật toán
mà một cấu hình lời giải được liệt kê ra. Như vậy đại lượng này được tính
bởi tổng độ phức tạp thuật toán chia cho tổng số cấu hình lời giải của bài
toán.

92 / 168
3.3 Thuật toán quay lui

Tư tưởng chính của thuật toán này là xây dựng dần các thành phần
của cấu hình bằng cách thử tất cả các khả năng có thể
Mô tả: giả thiết cấu hình được mô tả bởi một bộ gồm n thành phần
x1 , x2 , . . . , xn . Giả sử đã xác định được i − 1 thành phần
x1 , x2 , . . . , xi−1 (lời giải bộ phận cấp i − 1). Bây giờ ta xác định thành
phần xi bằng cách thử tất cả các giá trị có thể có của nó. Với mọi
khả năng j, kiểm tra xem j có chấp nhận được hay không, xảy ra 2
khả năng:
1 nếu chấp nhận j thì xác định xi theo j; nếu i = n thì ghi nhận 1 cấu
hình mới, trái lại tiến hành việc xác định xi+1
2 nếu không có khả năng nào cho xi thì quay lại bước trước để xác định
lại xi−1
Lưu ý: ghi nhớ tại mỗi bước những khả năng nào đã thử để tránh
trùng lặp. Các thông tin này cần được lưu trữ theo cơ cấu stack (vào
sau ra trước - LIFO)

93 / 168
Bước xác định xi có thể được diễn tả qua thủ tục được tổ chức đệ quy
dưới đây:
1 void Try ( int i ) {
2 int j ;
3 for ( j =1; j <= n [ i ]; j ++) {
4 if < chap nhan j > {
5 < update cac bien trang thai >
6 < ghi nhan x [ i ] moi theo j >
7 if ( i == n ) < ghi nhan mot cau hinh >
8 else Try ( i +1)
9 < tra cac bien ve trang thai cu >
0 }
1 }
2 }

Quá trình tìm kiếm lời giải theo thuật toán quay lui có thể được mô tả bởi cây
tìm kiếm lời giải (Vẽ cây)

94 / 168
Ví dụ

1 Liệt kê các xâu nhị phân độ dài n


1 void Try ( int k ) {
2 int i ;
3 for ( i =0; i <=1; i ++) {
4 a[k] = i;
5 if ( k == n ) < ghi nhan mot cau hinh >
6 else Try ( k +1);
7 }
8 }

BTVN: Viết chương trình trên máy tính và phân tích độ phức tạp khấu
trừ của thuật toán

95 / 168
Ví dụ

2 Liệt kê các hoán vị của n phần tử


1 void Try ( int k ) {
2 int i ;
3 for ( i =1; i <= n ; i ++)
4 if (! d [ i ]) {
5 a[k] = i;
6 d [ i ] = 1;
7 if ( k == n ) < ghi nhan mot cau hinh >
8 else Try ( k +1);
9 d [ i ] = 0;
10 }
11 }

BTVN: Viết chương trình trên máy tính

96 / 168
Ví dụ

3 Liệt kê các tổ hợp chập m của n phần tử {1, 2, . . . , n}


1 void Try ( int k ) {
2 int i ;
3 for ( i = a [k -1]+1; i <= n - m + k ; i ++) {
4 a[k] = i;
5 if ( k == m ) < ghi nhan mot cau hinh >
6 else Try ( k +1);
7 }
8 }

BTVN: Viết chương trình trên máy tính và phân tích độ phức tạp khấu
trừ của thuật toán

97 / 168
Bài toán xếp hậu
Liệt kê tất cả các cách xếp n quân Hậu trên bàn cờ n × n sao cho chúng
không ăn được lẫn nhau.

98 / 168
99 / 168
1 void Try ( int i ) {
2 int j ;
3 for ( j = 1; j <= n ; j ++)
4 if ( a ( j ) && b ( i + j ) && c (i - j )) { // chap nhan j
5 x(i) = j;
6 // ghi nhan trang thai moi
7 a ( j )= FALSE ; b ( i + j )= FALSE ; c (i - j ) = FALSE ;
8 if ( i == n ) OUTPUT ;
9 else Try ( i +1);
0 // tra lai trang thai cu
1 a ( j )= TRUE ; b ( i + j )= TRUE ; c (i - j ) = TRUE ;
2 }
3 }

n 3 4 7 8 9 10 11 12 13 14 15
Hn 0 2 40 92 352 724 2680 14, 200 73, 712 365, 596 2, 279, 184
Un 0 1 6 12 46 92 341 1, 781 9, 233 45, 752 285, 053
BTVN: Viết chương trình trên máy tính và phân tích độ phức tạp khấu trừ của
thuật toán
100 / 168
BTVN: Mã đi tuần

Cho bàn cờ n × n và một quân mã xuất phát tại vị trí (i, j). Hãy di chuyển
quân mã trên bàn cờ sao cho có thể đi được toàn bộ các ô trên bàn cờ mà
mỗi ô chỉ được qua 1 lần. Liệt kê tất cả khả năng có thể.

101 / 168
3.4 Phương pháp sinh
Được áp dụng để giải các bài toán liệt kê tổ hợp đặt ra nếu như thoả
mãn 2 điều kiện:
1 có thể xác định được một thứ tự trên tập các cấu hình tổ hợp cần liệt
kê, từ đó có thể xác đinh được cấu hình đầu tiên và cuối cùng trong
thứ tự đã xác định
2 xây dựng được thuật toán từ cấu hình đang có (chưa phải cuối cùng),
đưa ra cấu hình kế tiếp
Mô hình:
a. Xây dựng cấu hình ban đầu
b. Đưa ra cấu hình đang có
c. Xây dựng cấu hình kế tiếp:
F nếu không xây dựng được thì bài toán liệt kê kết thúc
F nếu xây dựng được thì quay về bước b.
Hạn chế:
I không phải cấu hình kế tiếp nào cũng được sinh một cách đơn giản từ
cấu hình hiện tại
I cấu hình ban đầu không phải dễ tìm vì ngay sự tồn tại của nó đôi khi
còn chưa chắc chắn
102 / 168
Sơ đồ thuật toán sinh

1 void Generate (){


2 < Xay dung cau hinh ban dau >
3 stop = FALSE ;
4 while not stop {
5 < Dua ra cau hinh dang co >
6 if < Cau hinh hien co la cau hinh cuoi cung >
7 stop = TRUE
8 else Sinh_ke_tiep
9 }
0 }

103 / 168
Ví dụ

1 Liệt kê tất cả các xâu nhị phân độ dài n.

104 / 168
Ví dụ

1 Liệt kê tất cả các xâu nhị phân độ dài n. Thuật toán:


I Lưu trữ xâu nhị phân bằng mảng b1 b2 . . . bn
I Cấu hình đầu tiên là 0 0 . . . 0; cấu hình cuối cùng là 1 1 . . . 1
I Cấu hình tiếp theo được sinh ra từ cấu hình hiện tại bằng cách:
F đi từ phải sang trái, tìm i đầu tiên sao cho bi = 0
F thay bi = 1 và bj = 0 với mọi i < j ≤ n
I ví dụ: cấu hình hiện tại là 11110010111 → cấu hình tiếp theo là

104 / 168
Ví dụ

1 Liệt kê tất cả các xâu nhị phân độ dài n. Thuật toán:


I Lưu trữ xâu nhị phân bằng mảng b1 b2 . . . bn
I Cấu hình đầu tiên là 0 0 . . . 0; cấu hình cuối cùng là 1 1 . . . 1
I Cấu hình tiếp theo được sinh ra từ cấu hình hiện tại bằng cách:
F đi từ phải sang trái, tìm i đầu tiên sao cho bi = 0
F thay bi = 1 và bj = 0 với mọi i < j ≤ n
I ví dụ: cấu hình hiện tại là 11110010111 → cấu hình tiếp theo là
11110011000
I BTVN: viết chương trình trên máy tính và phân tích độ phức tạp khấu
trừ của thuật toán

104 / 168
Ví dụ
2 Liệt kê các tập con m phần tử của tập n phần tử {1, 2, . . . , n}. Một
tập con m phần tử được biểu diễn bởi một bộ: (a1 , a2 , . . . , am ) trong
đó a1 < a2 < . . . < am .

105 / 168
Ví dụ
2 Liệt kê các tập con m phần tử của tập n phần tử {1, 2, . . . , n}. Một
tập con m phần tử được biểu diễn bởi một bộ: (a1 , a2 , . . . , am ) trong
đó a1 < a2 < . . . < am . Thuật toán:
I Thứ tự từ điển: Ta nói tập con a = (a1 , a2 , . . . , am ) đứng trước tập con
b = (b1 , b2 , . . . , bm ) nếu tìm được chỉ số k (1 ≤ k ≤ m) sao cho
a1 = b1 , a2 = b2 , . . . , ak−1 = bk−1 , ak < bk
I Xuất phát từ cấu hình hiện có a = (a1 , a2 , . . . , am ), cấu hình tiếp theo
được sinh ra như sau:
F tìm từ phải sang trái phần tử đầu tiên ai 6= n − i + 1 (chỉ số tính tăng
dần từ trái sang phải)
F thay ai bởi ai + 1 (giá trị của ai được update ngay để phục vụ cho
bước sau)
F thay aj bởi ai + j − i với j = i + 1, i + 2, . . . , m
I Ví dụ: với n = 6 và m = 4, cấu hình hiện tại: (1,2,5,6); cấu hình kế
tiếp là

105 / 168
Ví dụ
2 Liệt kê các tập con m phần tử của tập n phần tử {1, 2, . . . , n}. Một
tập con m phần tử được biểu diễn bởi một bộ: (a1 , a2 , . . . , am ) trong
đó a1 < a2 < . . . < am . Thuật toán:
I Thứ tự từ điển: Ta nói tập con a = (a1 , a2 , . . . , am ) đứng trước tập con
b = (b1 , b2 , . . . , bm ) nếu tìm được chỉ số k (1 ≤ k ≤ m) sao cho
a1 = b1 , a2 = b2 , . . . , ak−1 = bk−1 , ak < bk
I Xuất phát từ cấu hình hiện có a = (a1 , a2 , . . . , am ), cấu hình tiếp theo
được sinh ra như sau:
F tìm từ phải sang trái phần tử đầu tiên ai 6= n − i + 1 (chỉ số tính tăng
dần từ trái sang phải)
F thay ai bởi ai + 1 (giá trị của ai được update ngay để phục vụ cho
bước sau)
F thay aj bởi ai + j − i với j = i + 1, i + 2, . . . , m
I Ví dụ: với n = 6 và m = 4, cấu hình hiện tại: (1,2,5,6); cấu hình kế
tiếp là (1,3,4,5)
I BTVN: viết chương trình trên máy tính và phân tích độ phức tạp khấu
trừ của thuật toán

105 / 168
Ví dụ

3 Liệt kê tất cả các hoán vị của n phần tử {1, 2, . . . , n}. Một hoán vị
được biểu diễn bởi 1 bộ (a1 , a2 , . . . , an ).

106 / 168
Ví dụ

3 Liệt kê tất cả các hoán vị của n phần tử {1, 2, . . . , n}. Một hoán vị
được biểu diễn bởi 1 bộ (a1 , a2 , . . . , an ). Thuật toán
I Thứ tự từ điển: Ta nói hoán vị a = (a1 , a2 , . . . , an ) đứng trước hoán vị
b = (b1 , b2 , . . . , bn ) nếu tìm được chỉ số k (1 ≤ k ≤ n) sao cho
a1 = b1 , a2 = b2 , . . . , ak−1 = bk−1 , ak < bk
I Xuất phát từ cấu hình hiện tại, sinh cấu hình tiếp theo qua các bước
sau:
F tìm từ phải sang trái chỉ số j đầu tiên mà aj < aj+1
F tìm ak là số nhỏ nhất còn lớn hơn aj trong các số ở bên phải aj
F đổi chỗ aj với ak
F lật ngược đoạn từ aj+1 đến an
I Ví dụ: với n = 6, cấu hình hiện tại: (3,6,2,5,4,1); cấu hình kế tiếp là

106 / 168
Ví dụ

3 Liệt kê tất cả các hoán vị của n phần tử {1, 2, . . . , n}. Một hoán vị
được biểu diễn bởi 1 bộ (a1 , a2 , . . . , an ). Thuật toán
I Thứ tự từ điển: Ta nói hoán vị a = (a1 , a2 , . . . , an ) đứng trước hoán vị
b = (b1 , b2 , . . . , bn ) nếu tìm được chỉ số k (1 ≤ k ≤ n) sao cho
a1 = b1 , a2 = b2 , . . . , ak−1 = bk−1 , ak < bk
I Xuất phát từ cấu hình hiện tại, sinh cấu hình tiếp theo qua các bước
sau:
F tìm từ phải sang trái chỉ số j đầu tiên mà aj < aj+1
F tìm ak là số nhỏ nhất còn lớn hơn aj trong các số ở bên phải aj
F đổi chỗ aj với ak
F lật ngược đoạn từ aj+1 đến an
I Ví dụ: với n = 6, cấu hình hiện tại: (3,6,2,5,4,1); cấu hình kế tiếp là
(3,6,4,1,2,5)
I BTVN: viết chương trình trên máy tính và phân tích độ phức tạp khấu
trừ của thuật toán

106 / 168
Chương 4. Bài toán tồn tại

1 4.1 Giới thiệu bài toán


2 4.2 Phương pháp phản chứng
3 4.3 Nguyên lý Dirichlet
4 4.4 Hệ đại diện phân biệt
5 4.5 Định lý Ramsey

107 / 168
4.1 Giới thiệu bài toán

Trong rất nhiều bài toán tổ hợp, việc chỉ ra sự tồn tại của một cấu
hình thỏa mãn các tính chất cho trước là khó. Ví dụ:
I kỳ thủ đấu cờ xét nước đi tiếp theo, xem liệu có khả năng chiến thắng
hay không,
I giải một bức mật mã nhưng không biết mật mã này có tồn tại lời giải
hay không . . .
Vấn đề: Xét đến sự tồn tại của các cấu hình tổ hợp thỏa mãn các
tính chất cho trước.
Một bài toán tồn tại xem như giải xong nếu hoặc chỉ ra một cách xây
dựng cấu hình hoặc chứng minh chúng không có.

108 / 168
Một số bài toán
1 Bài toán về 36 sĩ quan (Euler): Có một lần người ta triệu tập từ 6
trung đoàn, mỗi trung đoàn 6 sĩ quan thuộc 6 cấp bậc khác nhau:
thiếu úy, trung úy, thượng úy, đại úy, thiếu tá, trung tá về tham dự
duyệt binh ở sư đoàn bộ. Hỏi rằng có thể xếp 36 sĩ quan này thành
một đội ngũ hình vuông sao cho trong mỗi hàng ngang hoặc hàng
dọc đều có đại diện của 6 trung đoàn và của cả 6 cấp bậc.

109 / 168
Một số bài toán
1 Bài toán về 36 sĩ quan (Euler): Có một lần người ta triệu tập từ 6
trung đoàn, mỗi trung đoàn 6 sĩ quan thuộc 6 cấp bậc khác nhau:
thiếu úy, trung úy, thượng úy, đại úy, thiếu tá, trung tá về tham dự
duyệt binh ở sư đoàn bộ. Hỏi rằng có thể xếp 36 sĩ quan này thành
một đội ngũ hình vuông sao cho trong mỗi hàng ngang hoặc hàng
dọc đều có đại diện của 6 trung đoàn và của cả 6 cấp bậc.
I Ký hiệu các trung đoàn bằng A, B, C , D, E , F và các cấp bậc bằng
a, b, c, d, e, f
I Tổng quát hóa bằng cách thay 6 bằng n
I Một lời giải n = 4:
Ab Dd Ba Cc
Bc Ca Ad Db
Cd Bb Dc Aa
Da Ac Cb Bd
I Ứng dụng: quy hoạch thực nghiệm, sắp xếp các lịch thi đấu, hình học
ánh xạ . . .

109 / 168
2 Bài toán 4 màu: Chứng minh rằng mọi bản đồ trên mặt phẳng đều có
thể tô bằng 4 màu sao cho không có hai nước láng giềng nào bị tô bởi
một màu. Chú ý ta xem mỗi nước là một vùng liên thông và hai nước
được gọi là láng giềng nếu chúng có chung đường biên giới liên tục.
Bài toán được chứng minh vào năm 1976 bằng máy tính điện tử.

Hình: Bản đồ Mỹ Hình: Bản đồ Azerbaijan

110 / 168
Hình: 4 màu Hình: 4 màu?

Hình: 5 màu? Hình: 7 màu

111 / 168
3 Hình lục giác thần bí: Trên 19 ô của hình lục giác (xem hình vẽ dưới
đây) hãy điền vào các số từ 1 đến 19 sao cho tổng theo 6 hướng của
lục giác bằng nhau và bằng 38.

112 / 168
4 Bài toán chọn 2n điểm trên lưới. Có thể chọn 2n điểm trên một lưới ô
vuông gồm n × n điểm sao cho không có 3 diểm nào được chọn thẳng
hàng hay không? Hiện nay người ta chỉ biết được lời giải của bài toán
khi kích thước n bé nhờ máy tính.

113 / 168
4.2 Phương pháp phản chứng
Giả thiết rằng kết luận của bài toán không xảy ra → thêm được 1 giả thiết
nữa, từ đó cần tìm dẫn chứng đi đến những điều vô lý hoặc trái với giả
thiết. Một số bài toán:
1 Cho 7 đoạn thẳng có độ dài lớn hơn 10 và nhỏ hơn 100. CMR luôn
tìm được 3 đoạn để có thể ghép thành 1 tam giác.

114 / 168
4.2 Phương pháp phản chứng
Giả thiết rằng kết luận của bài toán không xảy ra → thêm được 1 giả thiết
nữa, từ đó cần tìm dẫn chứng đi đến những điều vô lý hoặc trái với giả
thiết. Một số bài toán:
1 Cho 7 đoạn thẳng có độ dài lớn hơn 10 và nhỏ hơn 100. CMR luôn
tìm được 3 đoạn để có thể ghép thành 1 tam giác. Giải:
Kí hiệu các đoạn đã cho như sau: a1 ≤ a2 ≤ . . . ≤ a7 . Giả sử không
tồn tại 3 đoạn nào để ghép thành 1 tam giác, khi đó: a1 + a2 ≤ a3
a2 + a3 ≤ a4
a3 + a4 ≤ a5
a4 + a5 ≤ a6
a5 + a6 ≤ a7
→ a7 ≥ 130, trái giả thiết.
2 CMR không thể nối 31 máy tính sao cho mỗi máy được nối với đúng
5 máy tính khác.

114 / 168
4.2 Phương pháp phản chứng
Giả thiết rằng kết luận của bài toán không xảy ra → thêm được 1 giả thiết
nữa, từ đó cần tìm dẫn chứng đi đến những điều vô lý hoặc trái với giả
thiết. Một số bài toán:
1 Cho 7 đoạn thẳng có độ dài lớn hơn 10 và nhỏ hơn 100. CMR luôn
tìm được 3 đoạn để có thể ghép thành 1 tam giác. Giải:
Kí hiệu các đoạn đã cho như sau: a1 ≤ a2 ≤ . . . ≤ a7 . Giả sử không
tồn tại 3 đoạn nào để ghép thành 1 tam giác, khi đó: a1 + a2 ≤ a3
a2 + a3 ≤ a4
a3 + a4 ≤ a5
a4 + a5 ≤ a6
a5 + a6 ≤ a7
→ a7 ≥ 130, trái giả thiết.
2 CMR không thể nối 31 máy tính sao cho mỗi máy được nối với đúng
5 máy tính khác. Giải:
Giả sử điều ngược lại xảy ra, khi đó số lượng kênh nối là 5*31/2 =
75,5 (vô lý)
114 / 168
BTVN

1 Có 12 cầu thủ bóng rổ đeo áo với số từ 1 đến 12 đứng tập trung


thành một vòng tròn giữa sân. CMR 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.
2 Các học sinh của một lớp học gồm 45 nam và 35 nữ được xếp thành
một hàng ngang. CMR trong hàng luôn tìm được hai học sinh nam
mà ở giữa họ có đúng 8 người đúng xen vào.
3 Trên mặt phẳng cho n>5 điểm, khoảng cách giữa các cặp điểm là
khác nhau từng đôi một. Mỗi điểm được nối với điểm gần nó nhất.
CMR mỗi điểm được nối với không quá 5 điểm.

115 / 168
4.3 Nguyên lý Dirichlet

Nguyên lý: nếu xếp nhiều hơn k đối tượng vào k cái hộp thì luôn tìm
được ít nhất 1 cái hộp chứa không ít hơn 2 đối tượng.
Nguyên lý tổng quát: nếu xếp N đối tượng vào k cái hộp thì luôn tìm
được ít nhất 1 cái hộp chứa không ít hơn dN/ke đối tượng.

116 / 168
Một số ví dụ

1 Trong 367 người bao giờ cũng tìm được 2 người có ngày sinh nhật
giống nhau.
2 Trong một kỳ thi học sinh giỏi, điểm của bài thi được đánh giả bởi 1
số nguyên trong khoảng từ 0 đến 100. Hỏi cần phải có ít nhất bao
nhiêu học sinh để chắc chắn tìm được 2 học sinh có điểm giống
nhau?

117 / 168
Một số ví dụ

1 Trong 367 người bao giờ cũng tìm được 2 người có ngày sinh nhật
giống nhau.
2 Trong một kỳ thi học sinh giỏi, điểm của bài thi được đánh giả bởi 1
số nguyên trong khoảng từ 0 đến 100. Hỏi cần phải có ít nhất bao
nhiêu học sinh để chắc chắn tìm được 2 học sinh có điểm giống
nhau? Trả lời: 102
3 Trong số 100 người có ít nhất bao nhiêu người sinh cùng một tháng?

117 / 168
Một số ví dụ

1 Trong 367 người bao giờ cũng tìm được 2 người có ngày sinh nhật
giống nhau.
2 Trong một kỳ thi học sinh giỏi, điểm của bài thi được đánh giả bởi 1
số nguyên trong khoảng từ 0 đến 100. Hỏi cần phải có ít nhất bao
nhiêu học sinh để chắc chắn tìm được 2 học sinh có điểm giống
nhau? Trả lời: 102
3 Trong số 100 người có ít nhất bao nhiêu người sinh cùng một tháng?
Trả lời: 9
4 Có 5 loại học bổng khác nhau. Hỏi phải có ít nhất bao nhiêu sinh viên
để chắc chắn có 6 người nhận cùng một loại học bổng?

117 / 168
Một số ví dụ

1 Trong 367 người bao giờ cũng tìm được 2 người có ngày sinh nhật
giống nhau.
2 Trong một kỳ thi học sinh giỏi, điểm của bài thi được đánh giả bởi 1
số nguyên trong khoảng từ 0 đến 100. Hỏi cần phải có ít nhất bao
nhiêu học sinh để chắc chắn tìm được 2 học sinh có điểm giống
nhau? Trả lời: 102
3 Trong số 100 người có ít nhất bao nhiêu người sinh cùng một tháng?
Trả lời: 9
4 Có 5 loại học bổng khác nhau. Hỏi phải có ít nhất bao nhiêu sinh viên
để chắc chắn có 6 người nhận cùng một loại học bổng?
Trả lời: 5 × 5 + 1 = 26

117 / 168
4 Trong phòng họp có n người, CMR bao giờ cũng tìm được 2 người có
số người quen trong số những người dự họp là như nhau.

118 / 168
4 Trong phòng họp có n người, CMR bao giờ cũng tìm được 2 người có
số người quen trong số những người dự họp là như nhau.
Giải: Số người quen của một người chỉ có thể nhận giá trị từ 0 đến
n − 1. Nhưng không thể có đồng thời 1 người có số người quen bằng
0 và 1 người có số người quen bằng n − 1 → Số người quen của n
người chỉ có thể nhận nhiều nhất n − 1 giá trị khác nhau → có ít
nhất 2 người có số người quen bằng nhau.
5 Trong một tháng có 30 ngày, một đội bóng chuyền thi đấu mỗi ngày
ít nhất 1 trận, nhưng tổng không quá 45 trận. Hãy CMR luôn tìm
được một giai đoạn gồm một số ngày liên tục nào đó trong tháng sao
cho trong giai đoạn đó đội chơi đúng 14 trận.

118 / 168
Giải: giả sử aj là tổng số trận đấu cho đến ngày thứ j của đội bóng. Khi
đó a1 , a2 , . . . , a30 là dãy tăng, đồng thời 1 ≤ aj ≤ 45 → dãy
a1 + 14, a2 + 14, . . . , a30 + 14 cũng là dãy tăng và 15 ≤ aj + 14 ≤ 59. Có
tất cả 60 số nên phải có ít nhất 2 trong số 60 số đó bằng nhau theo
nguyên lý Dirichlet. Vì các số a1 , a2 , . . . , a30 đôi một khác nhau nên tồn
tại cặp ai = aj + 14 → từ ngày j đến ngày i đội bóng chơi đúng 14 trận
6 CMR trong số n + 1 số nguyên dương, mỗi số không lớn hơn 2n bao
giờ cũng tìm được hai số sao cho số này chia hết cho số kia.

119 / 168
Giải: giả sử aj là tổng số trận đấu cho đến ngày thứ j của đội bóng. Khi
đó a1 , a2 , . . . , a30 là dãy tăng, đồng thời 1 ≤ aj ≤ 45 → dãy
a1 + 14, a2 + 14, . . . , a30 + 14 cũng là dãy tăng và 15 ≤ aj + 14 ≤ 59. Có
tất cả 60 số nên phải có ít nhất 2 trong số 60 số đó bằng nhau theo
nguyên lý Dirichlet. Vì các số a1 , a2 , . . . , a30 đôi một khác nhau nên tồn
tại cặp ai = aj + 14 → từ ngày j đến ngày i đội bóng chơi đúng 14 trận
6 CMR trong số n + 1 số nguyên dương, mỗi số không lớn hơn 2n bao
giờ cũng tìm được hai số sao cho số này chia hết cho số kia.
Giải: Gọi các số đã cho là a1 , a2 , . . . , an+1 , mỗi số aj có dạng
aj = 2kj qj , j = 1, 2, . . . , n + 1, trong đó kj là số nguyên không âm, qj
là số lẻ < 2n. Do trong đoạn từ 1 đến 2n chỉ có n số lẻ → luôn tìm
được 2 số qi = qj → trong ai , aj có một số chia hết cho số kia.
7 Trong mặt phẳng cho 6 điểm được nối với nhau từng đôi bởi các
cung có màu xanh hoặc đỏ. Chứng minh luôn tìm được 3 điểm sao
cho các cung nối chúng có cùng màu.

119 / 168
Giải: Chọn một điểm P nào đó, P nối với 5 điểm còn lại bởi 5 cung có màu
xanh hoặc đỏ → có ít nhất 3 cung PA, PB, PC cùng màu, giả sử đó là màu
xanh. Nếu cả 3 cung AB, BC , CA đều có màu đỏ → ok, còn nếu có ít nhất
1 cung màu xanh, giả sử là AB thì ta có tam giác PAB cùng màu xanh.

120 / 168
BTVN

1 CMR trong số 10 người bất kỳ luôn tìm được hoặc là hai người có
tổng số tuổi chia hết cho 16, hoặc là hai người mà hiệu số tuổi của
họ chia hết cho 16.
2 Một trung tâm máy tính có 151 máy vi tính. Các máy của trung tâm
được đánh số từ 1 đến 300 sao cho không có hai máy nào được đánh
cùng số. CMR luôn tìm được hai máy được đánh số bởi các số nguyên
liên tiếp.
3 Mỗi dãy gồm n2 + 1 số phân biệt (nghĩa là các phần tử là khác nhau
từng đôi) luôn chứa hoặc dãy con tăng ngặt độ dài n + 1 hoặc dãy
con giảm ngặt độ dài n + 1.

121 / 168
4.4 Hệ đại diện phân biệt
Định nghĩa
Giả sử S1 , S2 , . . . , Sm là một họ các tập con của một tập hợp S (các Si
không nhất thiết khác nhau). Ta gọi một bộ có thứ tự a1 , a2 , . . . , am là
một hệ đại diện phân biệt (transversal - TRAN) của họ này nếu ai ∈ Si
và ai 6= aj (i 6= j). Thành phần ai được gọi là đại diện của tập con Si
(i = 1, . . . , m).

Ví dụ 1
S = {1, 2, 3, 4, 5}, S1 = {2, 5}, S2 = {2, 5}, S3 = {1, 2, 3, 4},
S4 = {1, 2, 5} có TRAN là (2, 5, 3, 1). Một TRAN khác là (5, 2, 4, 1).

Ví dụ 2
S = {1, 2, 3, 4, 5}, S1 = {2, 5}, S2 = {2, 5}, S3 = {1, 2, 3, 4},
S4 = {2, 5} không có TRAN!

122 / 168
Định lý Hall
Giả sử S1 , S2 , . . . , Sm thỏa mãn điều kiện:

N(Si1 ∪ Si2 ∪ . . . ∪ Sik ) ≥ k (điều kiện Hall)

với mọi 1 ≤ k ≤ m, 1 ≤ i1 < i2 < . . . < ik ≤ m và mỗi tập con này chứa ít
nhất t phần tử . Khi đó
nếu t ≤ m thì họ đang xét có ít nhất t! TRAN
t!
nếu t > m thì họ đang xét có ít nhất (t−m)! TRAN.

123 / 168
Ứng dụng thực tế

Bài toán người thi hành


Có m người thi hành n công việc. Cho biết người thứ i tập Si là tâp hợp
các công việc mà người đó có thể làm. Hỏi có thể phân công mỗi người
làm một việc được không?

Bài toán đám cưới vùng quê


Tại một làng quê có m chàng trai. Với mỗi chàng trai i, ta biết tập Si các
cô gái mà chàng ta thích. Hỏi có thể ghép mỗi cô cho một chàng mà
chàng nào cũng vừa ý hay không?

124 / 168
Ví dụ 3
Xét tập S = {1, 2, . . . , n}. Đếm số TRAN của họ tập con
Si = S − {i}, 1 ≤ i ≤ n.

125 / 168
Ví dụ 3
Xét tập S = {1, 2, . . . , n}. Đếm số TRAN của họ tập con
Si = S − {i}, 1 ≤ i ≤ n.
Mỗi TRAN là một hoán vị (a1 , a2 , . . . , an ) của {1, 2, . . . , n} sao cho ai 6= i, ∀i ⇒
đồng nhất mỗi TRAN với một mất thứ tự trên tập đang xét
⇒ # TRAN = Dn .

Ví dụ 4
Đếm số TRAN của họ tập con của tập S = {1, 2, . . . , n}: S1 = {1, 2},
S2 = {1, 2, 3}, S3 = {2, 3, 4}, . . . , Sn−1 = {n − 2, n − 1, n}, Sn = {n − 1, n}.

125 / 168
Ví dụ 3
Xét tập S = {1, 2, . . . , n}. Đếm số TRAN của họ tập con
Si = S − {i}, 1 ≤ i ≤ n.
Mỗi TRAN là một hoán vị (a1 , a2 , . . . , an ) của {1, 2, . . . , n} sao cho ai 6= i, ∀i ⇒
đồng nhất mỗi TRAN với một mất thứ tự trên tập đang xét
⇒ # TRAN = Dn .

Ví dụ 4
Đếm số TRAN của họ tập con của tập S = {1, 2, . . . , n}: S1 = {1, 2},
S2 = {1, 2, 3}, S3 = {2, 3, 4}, . . . , Sn−1 = {n − 2, n − 1, n}, Sn = {n − 1, n}. Để
bài toán xác định cả với n = 1, ta xem trường hợp này S1 = {1}. Gọi Fn là số
TRAN cần đếm (ứng với n > 1). Chia các TRAN này thành 2 loại:
1 là đại diện cho S1 . Khi đó các thành phần còn lại sẽ là một hệ đại diện
của họ {2, 3}, {2, 3, 4}, . . . , {n − 2, n − 1, n}, {n − 1, n}. Do vậy loại này có
Fn−1 TRAN.
2 là đại diện cho S1 . Khi đó bắt buộc 1 phải là đại diện cho S2 và các thành
phần còn lại sẽ là một hệ đại diện của họ {3, 4}, {3, 4, 5}, . . . ,
{n − 2, n − 1, n}, {n − 1, n}. Do vậy loại này có Fn−2 TRAN.
Vậy Fn = Fn−1 + Fn−2 .
125 / 168
4.5 Định lý Ramsey

4.5.1 Bài toán mở đầu


Trong số 6 người tại một bàn tiệc luôn tìm được hoặc 3 người đôi
một quen nhau hoặc 3 người đôi một không quen nhau?
Hỏi ít nhất có bao nhiêu người để chắc chắn tìm được hoặc 4 người
đôi một không quen nhau hoặc 4 người đôi một quen nhau?
...
⇒ các số Ramsey

126 / 168
4.5.2 Các số Ramsey

Định nghĩa 1
Gọi Kn = (V , E ) với V là tập gồm n điểm (đỉnh); E là tập các đoạn
(cạnh) nối giữa tất cả các cặp điểm trong V .

Định nghĩa 2
Giả sử i và j là 2 số nguyên sao cho i ≥ 2, j ≥ 2.
Số nguyên dương m có tính chất (i, j)-Ramsey nếu Km với mỗi cạnh
được tô bởi một trong 2 màu xanh, đỏ luôn chứa hoặc là Ki đỏ hoặc
là Kj xanh.
Ví dụ: 6 là số nhỏ nhất có tính chất (3,3)-Ramsey.

127 / 168
Định nghĩa 3
Số Ramsey R(i, j) là số nguyên dương nhỏ nhất có tính chất (i, j)-Ramsey.
Ví dụ: R(3, 3) = 6.

Ví dụ 1
Tìm R(2, 7)?

128 / 168
Định nghĩa 3
Số Ramsey R(i, j) là số nguyên dương nhỏ nhất có tính chất (i, j)-Ramsey.
Ví dụ: R(3, 3) = 6.

Ví dụ 1
Tìm R(2, 7)?

Bước 1: Tìm số nguyên dương n sao cho với mọi cách tô các cạnh của Kn
bởi xanh, đỏ luôn tìm được hoặc K2 đỏ hoặc K7 xanh. Xét K7 được tô xanh
đỏ, rõ ràng hoặc là tìm được ít nhất 1 cạnh của K7 được tô màu đỏ, hoặc là
tất cả các cạnh của nó đều được tô bởi màu xanh:
I nếu có cạnh tô màu đỏ ⇒ K2 đỏ;
I nếu tất cả các cạnh tô màu xanh ⇒ K7 xanh.
⇒ R(2, 7) ≤ 7.
R(2, 7) > 6 vì nến tô tất cả các cạnh của K6 bởi màu xanh ta sẽ không tìm
được K2 đỏ và K7 xanh nào.

⇒ Tổng quát R(2, k) = k, ∀k ≥ 2.


128 / 168
Tính chất của số Ramsey
R(i, j) = R(j, i);
Nếu m có tính chất (i, j)-Ramsey thì mọi số n > m cũng có tính chất
này;
Nếm m không có tính chất (i, j)-Ramsey thì mọi số n < m cũng
không có tính chất này;
Nếu i1 ≥ i2 thì R(i1 , j) ≥ R(i2 , j).

Hỏi có tồn tại R(i, j) với mọi i ≥ 2, j ≥ 2 hay không?

129 / 168
Bổ đề 1
Nếu i ≥ 3 và j ≥ 3 thì

R(i, j) ≤ R(i, j − 1) + R(i − 1, j)

Bổ đề 2
Nếu i ≥ 3 và j ≥ 3 và nếu R(i, j − 1) và R(i − 1, j) là các số chẵn thì

R(i, j) ≤ R(i, j − 1) + R(i − 1, j) − 1

Định lý 1 - Định lý Ramsey


Nếu i ≥ 2, j ≥ 2 là các số nguyên thì luôn tìm được số nguyên dương với
tính chất (i, j) − Ramsey ⇒ R(i, j) luôn tồn tại.
Khi (i, j) càng lớn thì việc tìm R(i, j) càng khó.

130 / 168
Ví dụ 2
Tìm R(3, 4)?

131 / 168
Ví dụ 2
Tìm R(3, 4)?
Áp dụng bổ đề 2: R(3, 4) ≤ R(3, 3) + R(2, 4) − 1 = 6 + 4 − 1 = 9;
Để chỉ ra R(3, 4) > 8, ta cần đưa ra 1 cách tô màu K8 không có tính
chất (3,4)-Ramsey.
⇒ R(3, 4) = 9

131 / 168
BTVN

1 Có 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ề 1 chủ đề. CMR luôn tìm được 3 nhà
bác học đôi một viết thư trao đổi nhau về cùng một chủ đề.
2 Chứng minh rằng: R(3, 4) = R(4, 3) = 9

132 / 168
Chương 5. Bài toán tối ưu

Giới thiệu các phương pháp giải quyết bài toán tối ưu đồng thời giải quyết
một số bài toán có vai trò quan trọng của lý thuyết tổ hợp:
Giới thiệu bài toán và phát biểu bài toán tối ưu cho các mô hình thực
tế.
Phân tích phương pháp liệt kê giải quyết bài toán tối ưu.
Phương pháp nhánh cận giải quyết bài toán tối ưu.
Phương pháp rút gọn giải quyết bài toán tối ưu.

133 / 168
Chương 5. Bài toán tối ưu

1 5.1 Giới thiệu bài toán


2 5.2 Thuật toán nhánh cận
3 5.3 Kỹ thuật rút gọn giải quyết bài toán người du lịch

134 / 168
5.1 Giới thiệu bài toán
Bài toán
Chọn trong số tất cả các cấu hình tổ hợp chấp nhận được cấu hình có giá
trị sử dụng tốt nhất.

Dạng tổng quát


f (x) → min(max)

x ∈ D được gọi là một phương án,


D gọi là tập các phương án của bài toán (thỏa mãn một số tính chất
cho trước),
hàm f (x) gọi là hàm mục tiêu của bài toán,
phương án x ∗ ∈ D đem lại giá trị nhỏ nhất (lớn nhất) cho hàm mục
tiêu được gọi là phương án tối ưu, khi đó f ∗ = f (x ∗ ) được gọi là giá
trị tối ưu của bài toán.
135 / 168
Một số bài toán
Bài toán Người du lịch - TSP (Travelling Salesman Problem)
Một người du lịch muốn đi thăm quan n thành phố T1 , T2 , . . . , Tn . Xuất phát từ
một thành phố nào đó, người du lịch muốn đi qua tất cả các thành phố còn lại,
mỗi thành phố đúng một lần, rồi quay trở lại thành phố xuất phát. Biết cij là chi
phí đi từ thành phố Ti đến thành phố Tj , hãy tìm hành trình với tổng chi phí là
nhỏ nhất.

136 / 168
Bài toán Người du lịch
Thiết lập được một tương ứng 1-1 giữa 1 hành trình voi 1 hoán vị
π = (π(1), π(2), . . . , π(n)) của n số tự nhiên 1, 2, . . . , n:
Tπ(1) → Tπ(2) → . . . → Tπ(n) → Tπ(1) .
Đặt f (π) = cπ(1),π(2) + . . . + cπ(n−1),π(n) + cπ(n),π(1) và P la tập tất
cả các hoán vị π.
→ bài toán tối ưu tổ hợp: min{f (π) : π ∈ P}
Cố định một thành phố làm điểm xuất phát, tổng số hành trình khác
nhau sẽ là (n − 1)!

137 / 168
Bài toán cái túi
Một nhà thám hiểm cần đem theo một cái túi có trọng lượng không quá
b. Có n đồ vật có thể đem theo. Đồ vật thứ j có trọng lượng aj và giá trị
sử dụng cj . Hỏi nhà thám hiểm cần đem theo những đồ vật nào để cho
tổng giá trị sử dụng là lớn nhất?

138 / 168
Bài toán cái túi
Xem việc chọn các đồ vật như một vecto nhị phân độ dài n:
x = (x1 , x2 , . . . , xn ), trong đó xj = 1 nghĩa là đồ vật j được chọn và
= 0 có nghĩa là không được chọn.
Tổng giá trị của đồ vật được chon: f (x) = Σnj=1 cj xj .
Tổng trọng lượng của đồ vật được chọn: g (x) = Σnj=1 aj xj .
⇒ Bài toán tối ưu tổ hợp: Trong số các vecto nhị phân độ dài n thỏa
mãn điều kiện g (x) ≤ b hãy tìm vecto x ∗ cho giá trị lớn nhất của
hàm mục tiêu f (x).

139 / 168
Bài toán cho thuê máy
Một ông chủ có một cái máy để cho thuê. Đầu tháng ông ta nhận được
yêu cầu thuê máy của m khách hàng. Mỗi khách hàng i sẽ cho biết tập Ni
các ngày trong tháng cần sử dụng máy. Ông chủ chỉ có quyền hoặc từ
chối yêu cầu của khách hàng i, hoặc nếu nhận thì phải bố trí máy phục vụ
khách hàng i đúng những ngày mà khách hàng này yêu cầu. Hỏi rằng ông
chủ phải tiếp nhận các yêu cầu của khách thế nào để cho tổng số ngày sử
dụng máy là lớn nhất.

140 / 168
Bài toán cho thuê máy
Ký hiệu I = {1, 2, . . . , m} là tập chỉ số khách hàng,
S là tập hợp các tập con của I .
Tập hợp tất cả các phương án cho thuê máy là:

D = {J ⊂ S : Nk ∩ Np = ∅, ∀k 6= p, k, p ∈ J}
P
Với mỗi phương án J ∈ D, f (J) = j∈J |Nj | sẽ là tổng số ngày sử
dụng máy theo phương án đó.
Bài toán đặt ra có thể phát biểu dưới dạng bài toán tối ưu tổ hợp sau:

max{f (j) : j ∈ D}

141 / 168
Bài toán phân công
Có n công việc và n thợ. Biết cij là chi phí cần trả để thợ i hoàn thành công việc
thứ j. Cần phải thuê thợ sao cho các công việc đều hoàn thành và mỗi thợ chỉ
thực hiện một công việc, mỗi công việc chỉ do một thợ thực hiện. Hãy tìm cách
thuê n nhân công sao cho tổng chi phí thuê thợ là nhỏ nhất.

142 / 168
Bài toán phân công
Mỗi phương án bố trí thợ thực hiện các công việc tương ứng với một
hoán vị π = (π(1), π(2), . . . , π(n)) của n số tự nhiên {1, 2, . . . , n}.
Chi phí theo phương án trên là f (π) = cπ(1),1 + cπ(2),2 + . . . + cπ(n),n .
Bài toán đặt ra được dẫn về bài toán tối ưu tổ hợp:

min{f (π) : π ∈ Π}

143 / 168
Bài toán lập lịch
Mỗi một chi tiết trong số n chi tiết D1 , D2 , . . . , Dn cần phải lần lượt được
gia công trên m máy M1 , M2 , . . . , Mm . Thời gian gia công chi tiết Di trên
máy Mj là tij . Hãy tìm lịch (trình tự gia công ) các chi tiết trên các mãy
sao cho việc hoàn thành gia công tất cả các chi tiết là sớm nhất có thể
được. Biết rằng, các chi tiết được gia công một cách liên tục.

144 / 168
Bài toán lập lịch
Mỗi một lịch gia công các chi tiết trên các máy sẽ tương ứng với một hoán
vị π = (π(1), π(2), . . . , π(n)) của n số tự nhiên {1, 2, . . . , n}.
Thời gian hoàn thành theo các lịch trên được xác định bởi hàm số:
n−1
X m
X
f (π) = cπ(j),π(j+1) + tk,π(n) ,
j=1 k=1

trong đó cij = Sj − Si , Sj là thời điểm bắt đầu thực hiện việc gia công chi
tiết j(i, j = 1, 2, . . . , n);
cij = tổng thời gian gián đoạn (được tính từ khi bắt đầu gia công chi tiết i)
gây ra bởi chi tiết j khi nó được gia công sau chi tiết i trong lịch gia công.
" k k−1
#
X X
cij = max tj` − ti` , i, j = 1, 2, . . . , n
1≤k≤m
`=1 `=1

bài toán đặt ra dẫn về bài toán tối ưu tổ hợp: min{f (π) : π ∈ Π}
145 / 168
5.2 Thuật toán nhánh cận (TTNC)

Là một phương pháp giải chủ yếu của bài toán tối ưu tổ hợp.
Phân hoạch các phương án của bài toán thành 2 hay nhiều tập con
được biểu diễn như các nút trên cây tìm kiếm.
Tìm cách đánh giá cận nhằm loại bỏ những nhánh của cây tìm kiếm
mà ta biết chắc là không chứa phương án tối ưu.
Tình huống tồi nhất vẫn phải duyệt toàn bộ.

146 / 168
5.2.1 Mô hình bài toán tổng quát tổng quát

Bài toán
min{f (x) : x ∈ D}

D là tập hữu hạn phần tử:


D = {x = (x1 , x2 , . . . , xn ) ∈ A1 × A2 × . . . × An ; x thoả mãn tính chất P},
A1 , A2 , . . . , An là các tập hữu hạn,
P là tính chất cho trên tích đề các A1 × A2 × . . . × An .

Nhánh cận (Branch and Bound)


Sử dụng thuật toán quay lui để xây dựng dần các thành phần của phương
án.
Gọi một bộ phận gồm k thành phần (a1 , a2 , . . . , ak ) xuất hiện trong quá
trình thực hiện thuật toán sẽ được gọi là phương án bộ phận cấp k.

147 / 168
Áp dụng TTNC trong trường hợp có thể tìm được một hàm g thoả mãn:

g (a1 , a2 , . . . , ak ) ≤ min{f (x) : x ∈ D, xi = ai , i = 1, 2, . . . k}

với mọi lời giải bộ phận (a1 , a2 , . . . , ak ), và với mọi k = 1, 2, . . .


g được gọi là hàm cận dưới. Giá trị g (a1 , a2 , . . . , ak ) là cận dưới của
phương án bộ phận (a1 , a2 , . . . , ak ).

Cắt nhánh
Gọi x̄ là giá trị hàm mục tiêu nhỏ nhất trong số các phương án đã duyệt, ký
hiệu f¯ = f (x̄). Ta gọi x̄ là phương án tốt nhất hiện có, còn f¯ là kỷ lục.
Nếu: g (a1 , a2 , . . . , ak ) > f¯
⇒ f¯ < g (a1 , a2 , . . . , ak ) ≤ min{f (x) : x ∈ D, xi = ai , i = 1, 2, . . . k}
⇒ tập con các phương án của bài toán D(a1 , a2 , . . . , ak ) chắc chắn không
chứa phương án tối ưu.
⇒ không cần phải phát triển phương án bộ phận (a1 , a2 , . . . , ak )
⇒loại bỏ các phương án trong tập D(a1 , a2 , . . . , ak ) khỏi quá trình tìm kiếm.
148 / 168
void Try(int k) {
/* Phát triển phương án bộ phận (a1 , a2 , . . . , ak )
theo thuật toán quay lui có kiểm tra cận dưới */
for (ak ∈ Ak ) {
if <chấp nhận ak > {
x(k) = ak ;
if (k == n) <Cập nhật kỷ lục>;
else if (g (a1 , a2 , . . . , ak ) ≤ f¯)
try(i + 1);
}
}
}

void Nhanh_Can(void) {
f¯ = +∞;
/* Nếu biết một phương án x nào đó thì có thể đặt f¯ = f (x̄). */
try(1);
if(f¯ < +∞) <f¯ là giá trị tối ưu, x̄ là phương án tối ưu>;
else <bài toán không có phương án>;
}
149 / 168
Nhận xét
Nếu không có điều kiện cắt nhánh if (g (a1 , a2 , . . . , ak ) ≤ f¯) thì thủ
tục Try sẽ liệt kê toàn bộ các phương án của bài toán ⇒ thuật toán
duyệt toàn bộ.
Việc xây dựng hàm g phụ thuộc vào từng bài toán cụ thể.
Việc tính giá trị của g phải đơn giản hơn việc giải bài toán gốc.
Giá trị của g (a1 , a2 , . . . , ak ) phải sát với giá trị tối ưu của bài toán
gốc.

150 / 168
5.2.2 TTNC giải Bài toán cái túi
Xét bài toán cái túi tổng quát hơn mô hình đã được trình bày trong mục 5.1.
Thay vì có n đồ vật, ở đây ta giả thiết rằng có n loại đồ vật và số lượng đồ vật
mỗi loại là không hạn chế. Ta có :

Bài toán cái túi biến nguyên


Có n loại đồ vật, đồ vật thứ j có trọng lượng aj và giá trị sử dụng cj
(j = 1, 2, . . . , n). Cần chất các đồ vật này vào một cái túi có trọng lượng là b sao
cho tổng giá trị sử dụng của các đồ vật đựng trong túi là lớn nhất.

Mô hình toán học


f ∗ = max f (x) = Σnj=1 cj xj : Σnj=1 aj xj ≤ b, xj ∈ Z+ , j = 1, 2, . . . , n


D là tập các phương án của bài toán:

D = x = (x1 , x2 , . . . , xn ) : Σnj=1 aj xj ≤ b, xj ∈ Z+ , j = 1, 2, . . . , n


151 / 168
Không giảm tính tổng quát ta giả thiết rằng, các đồ vật được đánh số sao cho:
c1 c2 cn
≥ ≥ ... ≥
a1 a2 an

Để xây dựng hàm tính cận dưới, ta xét bài toán cái túi biến liên tục sau. Tìm:

g ∗ = max Σnj=1 cj xj : Σnj=1 aj xj ≤ b, xj ≥ 0, j = 1, 2, . . . , n




Mệnh đề
Phương án tối ưu của công thức tính g ∗ là vectơ x̄ = (x¯1 , x¯2 , . . . , x¯n ) với:

b
x¯1 = , x¯2 = x¯3 = · · · = x¯n = 0
a1

và giá trị tối ưu là


c1 b
g∗ =
a1

152 / 168
Chứng minh:
Xét x = (x1 , x2 , . . . , xn ) là một phương án tùy ý của bài toán cái túi biến liên tục.
Khi đó:
c1
cj xj ≤ aj xj , j = 1, 2, . . . , n
a1
c1 c1 c1
⇒ Σnj=1 cj xj ≤ Σnj=1 aj xj = Σnj=1 cj xj ≤ b = g ∗ .
a1 a1 a1

Áp dụng vào TTNC


Giả sử đang có phương án bộ phận cấp k: (u1 , u2 , . . . , uk ) ⇒ giá trị sử dụng của
các đồ vật đang có trong túi là:

σk = c1 u1 + c2 u2 + · · · + ck uk ,

trọng lượng còn lại của túi là:

bk = b − (a1 u1 + a2 u2 + · · · + ak uk ).

153 / 168
Ta có:
max {f (x) : x ∈ D, xj = uj , j = 1, 2, . . . , n}
= max σk + Σnj=k+1 cj xj : Σnj=k+1 aj xj ≤ bk , xj ∈ Z+ , j = k + 1, k + 2, . . . , n


≤ σk + max Σnj=k+1 cj xj : Σnj=k+1 aj xj ≤ bk , xj ≥ 0, j = k + 1, k + 2, . . . , n




ck+1 bk
= σk +
ak+1
⇒ cận trên cho phương án bộ phận (u1 , u2 , . . . , uk ):

ck+1 bk
g (u1 , u2 , . . . , uk ) = σk + .
ak+1

Chú ý
Khi tiếp tục xây dựng h thànhi phần thứ k + 1 của lời giải, các giá trị đề cử cho
xk+1 sẽ là 0, 1, . . . , abk+1
k
⇒ khi chọn giá trị cho xk+1 ta sẽ duyệt các giá trị đề
cử theo thứ tự giảm dần.

BTVN: Viết chương trình trên máy tính giải bài toán cái túi bằng TTNC trên.
154 / 168
Ví dụ
Giải bài toán cái túi sau theo thuật toán nhánh cận:

f (x) = 10x1 + 5x2 + 3x3 + 6x4 → max

5x1 + 3x2 + 2x3 + 4x4 ≤ 8


xj ∈ Z+ , j = 1, 2, 3, 4.

155 / 168
156 / 168
5.2.3 TTNC giải bài toán Người du lịch

157 / 168
Cố định thành phố xuất phát là T1 . Bài toán Người du lịch được đưa về bài toán:
Tìm cực tiểu của hàm

f (x2 , x3 , . . . , xn ) = c[1, x2 ] + c[x2 , x3 ] + . . . + c[xn−1 , xn ] + c[xn , x1 ] → min

Gọi:
cmin = min {c[i, j], i, j = 1, 2, . . . , n, i 6= j}
là chi phí đi lại nhỏ nhất giữa các thành phố.
Giả sử ta đang có phương án bộ phận (u1 , u2 , . . . , uk ) tương ứng với hành trình
bộ phận qua k thành phố:

T1 → T (u2 ) → . . . → T (uk−1 ) → T (uk ).

với chi phí phải trả theo hành trình bộ phận này là

σ = c[1, u2 ] + c[u2 , u3 ] + . . . + c[xk−1 , uk ].

Do chi phí phải trả cho việc đi qua mỗi một trong số n − k + 1 đoạn đường còn lại
đều không nhiều hơn cmin ⇒ cận dưới cho phương án bộ phận (u1 , u2 , . . . , uk ):

g (u1 , u2 , . . . , uk ) = σ + (n − k + 1)cmin
158 / 168
Ví dụ
Giải bài toán người du lịch với ma trận chi phí như sau
 
1 2 3 4 5
 
 1 0 3 14 18 15 
 
 2 3 0 4 22 20 
 
 
 3 17 9 0 16 4 
 
 4 6 4 7 0 12 
 
5 9 15 11 5 0

159 / 168
160 / 168
TTNC giai bai toan nguoi du lich

C = {c(ij) : i, j = 1, 2, . . . , n}: ma tra chi phi


(π(1), π(2)), (π(2), π(3)), . . . , (π(n − 1), π(n)), (π(n), π(1)): mot
hanh trinh cua nguoi du lich, (π(j − 1), π(j)) duoc goi la mot canh
cua hanh trinh
Phan tap cac hanh trinh thanh 2 tap con:
I mot tap gom nhung hanh trinh chua mot canh (i, j) nao do
I mot tap khong chua canh (i, j)

161 / 168
Tinh can duoi

Tinh can duoi cua ham muc tieu tren tung mot trong hai tap con
tren (can duoi nghia la gia tri nho nhat ma ham muc tieu co the dat
duoc) → viec tim kiem se tiep tuc tren tap con co gia tri can duoi
nho hon den khi ta tim duoc hanh trinh day du
Tong chi phi cua mot hanh trinh nguoi du lich se chua dung mot
phan tu cua moi dong va dung mot phan tu cua moi cot trong ma
tran chi phi C
Tru bot moi phan tu cua mot dong (hay cot) cua ma tran C di cung
mot so α thi do dai cua tat ca cac hanh trinh se cung giam di α →
hanh trinh toi uu khong thay doi

162 / 168
Thu tuc rut gon:
Tru bot cac phan tu cua moi dong va moi cot di mot hang so sao cho thu
duoc ma tran gom cac phan tu khong am ma trong moi dong moi cot deu
co it nhat 1 so 0 thi ta se thu duoc can duoi la tong cac hang so tru do

Vi
 du:   
1 2 3 4 5 6 1 2 3 4 5 6

 1 ∞ 3 93 13 33 9  3

 1 ∞
 0 75 2 30 6 

2 4 ∞ 77 42 21 16  4  2 0 ∞ 58 30 17 12 
   

   

 3 45 17 ∞ 36 16 28 
 16 →  3 29
 1 ∞ 12 0 12 
4 39 90 80 ∞ 56 7  7  4 32 83 58 ∞ 49 0 
   

   
 5 28 46 88 33 ∞ 25  25  5 3 21 48 0 ∞ 0 
6 3 88 18 46 92 ∞ 3 6 0 85 0 35 89 ∞
0 0 15 8 0 0
Can duoi = Tong cac hang so rut gon = 81

163 / 168
Gia su chon canh (6, 3) de phan thanh 2 tap cac phuong an chua va
khong chua (6, 3):
I tap khong chua (6, 3) (phai): dat C6,3 = ∞ → rut gon ma tran bang
cach tru cot 3 cho 48 → can duoi = 81 + 48 = 129
I tap chua (6, 3) (trai): loai dong 6 cot 3 khoi ma tran; dat C3,6 = ∞.
Can duoi khong thay doi = 81 →
Hành trình chứa (6,3) Hành trình không chứa (6,3) 
  1 2 3 4 5 6
1 2 4 5 6 
  1 ∞ 0 27 2 30 6

 
 1 ∞ 0 2 30 6   
 2 0 ∞ 30 17 12   2 0 ∞ 10 30 17 12
  

  3 29 1 ∞ 12 0 12
  
 
 3 29 1 12 0 ∞   
 4 32 83 ∞ 49 0   4 32 83 10
  ∞ 49 0 

 5 3 21 0 0 ∞ 0
  
5 3 21 0 ∞ 0

6 0 85 ∞ 35 89 ∞
Cận dưới = 81 Cận dưới = 129

164 / 168
Quy tac chon phan nhanh:
Chon canh de phan nhanh sao cho ta thu duoc can duoi cua nhanh
ben phai la lon nhat so voi viec phan nhanh theo cac canh khac →
nham cat nhanh toi da co the → chon so 0 nao trong ma tran ma khi
thay no boi ∞ se cho ta tong hang so rut gon theo dong va cot chua
no la lon nhat
Trong qua trinh tim kiem, luon di theo nhanh ben trai truoc do ma
tran duoc rut gon voi bac giam di mot
Ngan cam tao chu trinh con: khi phan nhanh dua vao canh (iu , j` ),
neu iu la dinh cuoi cua mot duong di (i1 , i2 , . . . , iu ) va j` la dinh dau
cua duong di (j1 , j2 , . . . , jk ), ta phai cam canh (jk , i1 )

165 / 168
Hành trình chứa (6,3) (4,6) Hành trình chứa (6,3) không
 chứa (4,6)
  1 2 4 5 6
1 2 4 5  
 1 ∞ 0 2 30 6 
 1 ∞ 0 2 30 
   
   2 0 ∞ 30 17 12 
 2 0 ∞ 30 17  



   3 29 1 12 0 ∞ 
3 29 1 ∞ 0
   
   4 32 83 ∞ 49 ∞ 
5 3 21 0 ∞
 
5 3 21 0 ∞ 0
Cận dưới = 81 Cận dưới = 113
   
2 4 5 2 4 5  
    2 5
 1 ∞ 2
 →  1 ∞ 0 28  → 
30   
 3 ∞ 0 
 
 3 1 ∞ 0   3 0 ∞ 0 
  
5 0 ∞

5 21 0 ∞ 5 20 0 ∞
Hành trình chứa (6, 3)(4, 6)(2, 1)(1, 4)(3, 5)(5, 2) → Hành trình
1, 4, 6, 3, 5, 2 với chi phí là 104

166 / 168
void TSP(Edges, cost, A) {
cost = cost+ Reduce(A, n − Edges);
if (cost < MinCost) {
if (edges == n − 2) {
<bổ xung nốt hai cạnh còn lại>;
MinCost := Cost;
}
else {
BestEdge(A, n − eges, r , c, beta);
LowerBound = Cost + beta;
<Ngăn cấm tạo thành hành trình con>;
NewA = < A loại bỏ dòng r cột c>;
TSP(edges + 1, cost, NewA);/*đi theo nhánh trái*/
<Khôi phục A bằng cách bổ xung dòng r cột c>;
if (LowerBound < MinCost) {
/* đi theo nhánh phải*/
A[r , c] = ∞;
TSP(edges, cost, A);
A[r , c] = 0;
}
}
< Khôi phục ma trận A>;/* thêm lại các hằng số rút gọn */
}
167 / 168
}
Những nội dung cần ghi nhớ

Thế nào là một bài toán tối ưu?


Ý nghĩa của bài toán tối ưu trong các mô hình thực tế.
Hiểu phương pháp nhánh cận, phương pháp xây dựng cận và những
vấn đề liên quan.
Hiểu phương pháp rút gọn ma trận trong giải quyết bài toán người du
lịch.

168 / 168

You might also like