Thiết kế thuật toán Lé SY Vinh Bộ môn Khoa Học Máy Tính — Khoa CNTT Dai Hoc Cong Nghé - DHQGHN vinhioi@yahoo.com... Chia Dé Tri Divide and Conquer Chia bài toán lớn thành các bài toán
Trang 1Thiết kế thuật toán
Lé SY Vinh
Bộ môn Khoa Học Máy Tính — Khoa CNTT
Dai Hoc Cong Nghé - DHQGHN
vinhioi@yahoo.com
Trang 2Chia Dé Tri (Divide and Conquer)
Chia bài toán lớn thành các bài toán có kích thước nhỏ
Cải các bài toán có kích thước nhỏ
Kêt hợp nghiệm của các bài toán có kích thước nhỏ đê giải bài toán lớn
Trang 3Ví dụ: Dãy sô Fibonacci
Day Fibonacci:
012358 13
ý) =0
⁄ =1
TK) = fk-D) + f(k-2)
Fibonacci DAC (k) {
if (k == 0) return 0
else if (k == 1) return I
else return Fibonacci DAC (k-1) + fibonacci DAC (k-2)
j
Nhận xét: Các bài toán nhỏ được giải quyết dựa vào những bài toán nhỏ hơn gidng nhau
Trang 4Quy hoach dong (Dynamic programming)
* Gidng phuong phap ‘chia-dé-tri’ (divide-and-conquer) la giai quyét bai toán lớn dựa vào kêt quả các bài toán con
¢ Điểm khác biệt là quy hoạch động lưu lại nghiệm của tất cả các bài toán
con, môi bài toán con chỉ phải tính toán l lân
° - Quy hoach động thường được dùng để giải quyết những bài toán liên quan đên tôi ưu hóa (tim nghiệm tôt nhât)
Trang 5Ví dụ: Dãy sô Fibonacci
int fib[N];
for (int i = 0; i<= N; i++)
fib[i] = -1;
fib[0|= 0;
fib[1] = 1;
int fibonacci (int k) {
if (fib[k] == -1)
fib[k] = fibonacci (k-1) + fibonacci (k-2);
return fib[k];
Trang 6Câu trúc chung của phương pháp quy hoạch động
Đưa ra cách tính nghiệm của các bài toán con đơn giản Tìm công thức xây dựng nghiệm của bài toán thông qua nghiệm của các bài toán con
Thiết kế bảng để lưu nghiệm của các bài toán
Tính nghiệm của các bài toán từ nhỏ đến lớn
Xây dựng nghiệm của bài toán cân tìm từ bảng
Trang 7Vị dụ: Bài toán cái ba lô
Có N đồ vật, đô vật ¡ có khôi lượng w, và giá trỊ /, Một tên trộm có | chiếc ba
lô có thê mang được không qúa M kg Hãy tìm cách mang một số đồ vật để tong giá trị lây được là lớn nhất Biết răng, w, nguyên dương nhỏ hơn 101, 1⁄4 nguyên dương nhỏ hơn 1001
Vị dụ
N=4.M-=I0
l
l
Trang 8Ví dụ: Dãy con chung
Cho hai dãy sô 4 = (a; ,a,) và 8 = (bạ„, ,b,„), tim day s6 C = (c,, ,¢,) sao
cho C la day con cua ca A va B, va C dai nhat co thé
Vi du:
A= (3, 5, 1, 3, 5, 5, 3)
B=(1, 5, 3,5, 3, 1)
C=(5, 3, 5,3) hoac (1, 3, 5, 3) hoac (1, 5, 5, 3)
Trang 9Ví dụ: Dãy con liên nhau tông lớn nhất
Cho dãy SO A = (a, -,a,), tim dãy con liên nhau (đ, đ, , ¬ a;) voi tong lon nhat
Vi du:
A=(-3, 5, -4, 3, 2, -4, 1)
Day con lién nhau tong lớn nhất: (5, -4, 3, 2)
Trang 10Vị dụ: Chia kẹo
Có N gói kẹo, gói kẹo 7 có ø, cái Hãy chia N gói kẹo trên thành 2 đồng sao cho chênh lệnh giữa tổng số kẹo của hai đồng là ít nhất Lưu ý là không được chia nhỏ các gói kẹo ra
Vị dụ:
N=»
13495
Chia thành: 19 va3 45