Tải bản đầy đủ (.doc) (16 trang)

So sánh phương pháp tham lam và quy hoạch động trong xây dựng thuật toán để ứng dụng bồi dưỡng học sinh giỏi

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (129.64 KB, 16 trang )

1. Mở đầu:
1.1. Lí do chọn đề tài:
Tin học là một môn học mới trong các trường trung học phổ thông
(THPT), được đưa vào giảng dạy chính thức trong các trường THPT từ năm
2006 – 2007. Tuy nhiên trong thực tế môn Tin học đã được đưa vào tham gia thi
học sinh giỏi cấp tỉnh, cấp quốc gia từ rất lâu.
Như chúng ta đã biết, trong các kỳ thi học sinh giỏi thì các lớp bài toán về
tối ưu hóa luôn được ưu tiên lựa chọn trong các đề thi vì tính ứng dụng vào thực
tiễn cao. Để giải quyết lớp các bài toán tối ưu đó, có rất nhiều phương pháp như:
phương pháp nhánh cận, phương pháp quy hoạch động, phương pháp tham
lam...Tuy nhiên lại chưa có các tài liệu nghiên cứu nào chuyên sâu về vấn đề
này, đồng nghiệp, nhà trường chưa có nhiều kinh nghiệm để giải quyết, khắc
phục. Vậy “Có phải tất cả các bài toán tối ưu đều có thể áp dụng được tất cả các
phương pháp để giải không?; “Làm thế nào để nhận dạng được bài toán có thể
áp dụng phương pháp nào?; “Làm thế nào có thể giải một bài toán bằng các
phương pháp đó?”;…
Chính vì những lý do trên mà trong nội dung của sáng kiến kinh nghiệm
lần này tôi xin giới thiệu một chuyên đề mới trong công tác bồi dưỡng học sinh
giỏi của mình đó là: “So sánh phương pháp tham lam và quy hoạch động
trong xây dựng thuật toán để ứng dụng bồi dưỡng học sinh giỏi.”
1.2. Mục đích nghiên cứu:
Nhằm nâng cao chất lượng giảng dạy cũng như học tập của học sinh trong
quá trình bồi dưỡng học sinh giỏi từ đó nâng cao chất lượng giải trong các kỳ thi
học sinh giỏi Tin học.
1.3. Đối tượng nghiên cứu:
- Học sinh đội tuyển khối 10 và khối 11.
1.4. Phương pháp nghiên cứu:
Trong phần này tôi sẽ đưa ra phương pháp nghiên cứu xây dựng cơ sở lý
thuyết tổng quan hai phương pháp tham lam, quy hoạch động và giới thiệu thêm
một số phương pháp khác, từ đó đưa ra một số ví dụ cụ thể có sử dụng hai
phương pháp trên để có cơ sở so sánh, nhằm giúp học sinh nhận biết và vận


dụng vào các loại bài toán cụ thể.
1.5. Những điểm mới của sáng kiến kinh nghiệm:
Trong sáng kiến kinh nghiệm này, tôi có rút ra ưu điểm cũng như hạn chế
của cả 2 phương pháp tham lam và quy hoạch động, từ đó đưa ra hướng giải
quyết, cách vận dụng nhằm giúp học sinh vận dụng linh hoạt với từng loại bài
toán giúp đạt hiểu quả tối ưu nhất.
2. Nội dung của sáng kiến kinh nghiệm:
2.1. Cơ sở lý luận:
Để giải quyết một bài toán tối ưu trong công tác bồi dưỡng học sinh giỏi
thì có rất nhiều phương pháp để giải quyết bài toán này, ví dụ như phương pháp
Tham lam, phương pháp Quay lui, phương pháp tìm Nhánh cận, phương pháp
Quy hoạch động, ... Tuy nhiên, làm thế nào để nhận dạng được bài toán có thể
áp dụng phương pháp nào?, phương pháp nào thì tối ưu hơn?... Vậy tôi đưa ra
1


hai phương pháp tham lam và quy hoạch động để tìm hiểu kỹ hơn làm rõ các câu
hỏi trên.
2.2. Thực trạng vấn đề:
Xuất phát từ thực tế, trong các kỳ thi học sinh giỏi tin học thì các lớp bài
toán về tối ưu hóa luôn được ưu tiên lựa chọn trong các đề của các kỳ thi học
sinh giỏi Tỉnh, các kỳ thi Olympic, các kỳ thi Quốc gia, ví dụ như: đề thi
HSGQG Tin học năm học 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019; đề
thi Olympic Tin học 30/4 hầu hết các năm; đề thi HSG Tin học Tỉnh Thanh Hóa
hầu hết các năm.
Hơn thế nữa, học sinh thường không nắm rõ phải sử dụng phương pháp
nào khi giải các lớp bài toán tối ưu hóa.
2.3. Các giải pháp .
2.3.1. Phương pháp quy hoạch động
2.3.1.1. Khái niệm về phương pháp quy hoạch động

a. Khái niệm
Phương pháp quy hoạch động (Dynamic Programming) là một kỹ thuật
nhằm đơn giản hóa việc tính toán các công thức truy hồi bằng cách lưu toàn bộ
hay một phần kết quả tính toán tại mỗi bước trước đó với mục đích sử dụng lại.
Như vậy, Quy hoạch động = Chia để trị + Mảng (lưu lại kết quả).
Phương pháp quy hoạch động do nhà toán học người Mỹ Richard Bellman
(1920-1984) phát minh năm 1953. Phương pháp này dùng để giải các bài toán
tối ưu có bản chất đệ quy, tức là tìm phương án tối ưu cho bài toán đó có thể đưa
về tìm phương án tối ưu của một số hữu hạn các bài toán con.
Điểm khác nhau cơ bản giữa quy hoạch động và phương pháp đệ quy là:
Phương pháp đệ quy giải quyết bài toán theo hướng top-down, nghĩa là để
giải bài toán ban đầu, ta phải đi giải tất cả các bài toán con của nó. Đây là một
phương pháp hay, tuy nhiên phương pháp này sẽ gặp hạn chế về mặt thời gian,
tốc độ do phải tính đi tính lại nhiều lần một số bài toán con giống nhau nào đó.
Phương pháp quy hoạch động sử dụng nguyên lý bottom-up, nghĩa là "đi từ
dưới lên". Đầu tiên, ta sẽ phải giải các bài toán con đơn giản nhất, có thể tìm
ngay ra nghiệm. Sau đó kết hợp các bài toán con này lại để tìm lời giải cho bài
toán lớn hơn và cứ như thế cho đến khi giải được bài toán yêu cầu. Với phương
pháp này, mỗi bài toán con sau khi giải xong đều được lưu trữ lại và đem ra sử
dụng nếu cần. Do đó tiết kiệm bộ nhớ và cải thiện được tốc độ.
b. Đặc điểm chung của quy hoạch động
Quy hoạch động bắt đầu từ việc giải tất cả các bài toán nhỏ nhất (bài toán
cơ sở) để từ đó từng bước giải quyết những bài toán lớn hơn cho tới khi giải
được bài toán lớn nhất (bài toán ban đầu).
Quy hoạch động cần phải có bảng phương án.
Ý tưởng cơ bản của phương pháp quy hoạch động là tránh tính toán lại các
bài toán con đã xét, nói cách khác phương pháp quy hoạch động đã thể hiện sức
mạnh của nguyên lý chia để trị đến cao độ.
Tóm lại:
2



+ Quy hoạch động dùng để giải quyết bài toán tối ưu theo nguyên lý “chia
để trị” nhưng thực chất là một phương pháp cải tiến hơn của phương pháp giải
quyết bài toán theo hướng đệ quy.
+ Quy hoạch động làm giảm độ phức tạp, giảm thời gian giải quyết bài
toán.
+ Quy hoạch động thường tiếp cận theo hướng từ dưới lên (Bottom-up).
c. Các yêu cầu của một bài toán tối ưu sử dụng được phương pháp quy
hoạch động
Một bài toán tối ưu muốn giải được bằng phương pháp quy hoạch động khi
bài toán tối ưu đó có các đặc điểm dưới đây:
i. Bài toán lớn phải phân rã được thành nhiều bài toán con, mà sự phối hợp
lời giải của các bài toán con đó cho ta lời giải của bài toán lớn.
ii. Vì quy hoạch động là đi giải tất cả các bài toán con nên nếu không đủ
không gian vật lý lưu trữ kết quả (bộ nhớ, đĩa…) để phối hợp chúng thì phương
pháp quy hoạch động cũng không thể thực hiện được.
iii. Quá trình từ bài toán cơ sở tìm ra lời giải bài toán ban đầu phải qua hữu
hạn bước.
2.3.1.2 Các bước giải bài toán tối ưu bằng phương pháp quy hoạch động
Bước 1: Lập công thức truy hồi
Dựa vào nguyên lý tối ưu tìm cách chia quá trình giải bài toán thành từng
giai đoạn, sau đó tìm hệ thức biểu diễn tương quan quyết định của bước đang xử
lý với các bước đã xử lý trước đó. Hoặc tìm cách phân rã bài toán thành các “bài
toán con” tương tự có kích thước nhỏ hơn, tìm hệ thức nêu quan hệ giữa kết quả
bài toán kích thước đã cho với kết quả của các “bài toán con” cùng kiểu có kích
thước nhỏ hơn của nó nhằm xây dựng phương trình truy toán (dạng hàm hoặc
thủ tục đệ quy).
Bước 2: Tổ chức dữ liệu và chương trình
Tổ chức dữ liệu sao cho đạt các yêu cầu sau:

• Dữ liệu được tính toán dần theo các bước.
• Dữ liệu được lưu trữ để giảm lượng tính toán lặp lại.
• Kích thước miền nhớ dành cho lưu trữ dữ liệu càng nhỏ càng tốt, kiểu
dữ liệu được chọn phù hợp, nên chọn đơn giản dễ truy cập.
Cụ thể:
• Các giá trị tối ưu của bài toán thường được lưu trữ trong một bảng
(mảng một chiều hoặc hai, ba, v.v… chiều).
• Cần lưu ý khởi trị các giá trị ban đầu của bảng cho thích hợp, đó là các
kết quả của các bài toán con có kích cỡ nhỏ nhất của bài toán đang
giải.
• Dựa vào công thức và các giá trị đã có trong bảng để tìm dần các giá
trị còn lại của bảng.
• Ngoài ra còn cần mảng lưu trữ nghiệm tương ứng với các giá trị tối ưu
trong từng gian đoạn.
• Dựa vào bảng lưu trữ nghiệm và bảng giá trị tối ưu trong từng giai
đoạn đã xây dựng, tìm ra kết quả bài toán.
3


Bước 3: Truy vết, tìm nghiệm của bài toán dựa vào bảng phương án
Làm tốt thuật toán bằng cách thu gọn hệ thức truy hồi và giảm kích thước
miền nhớ. Thường tìm cách dùng mảng một chiều thay cho mảng hai chiều nếu
giá trị một dòng (hoặc cột) của mảng hai chiều chỉ phụ thuộc một dòng (hoặc
cột) kề trước.
Trong một số trường hợp có thể thay mảng hai chiều với các giá trị phần tử
chỉ nhận giá trị 0, 1 bởi mảng hai chiều mới bằng cách dùng kỹ thuật quản lý bit.
2.3.1.3. Ưu điểm và hạn chế của phương pháp quy hoạch động
a. Ưu điểm
Tiết kiệm được thời gian thực hiện vì không cần phải tính đi tính lại nhiều
lần một số bài toán con giống nhau.

Chương trình thực hiện nhanh do không phải tốn thời gian giải lại một bài
toán con đã được giải.
Kỹ thuật quy hoạch động có thể vận dụng để giải các bài toán tối ưu, các
bài toán có công thức truy hồi.
b. Hạn chế
Số lượng các bài toán con cần giải quyết và lưu giữ kết quả là rất lớn.
Sự kết hợp lời giải của các bài toán con chưa chắc cho ta lời giải của bài
toán ban đầu.
Việc tìm công thức truy hồi hoặc tìm cách phân rã bài toán nhiều khi đòi
hỏi sự phân tích tổng hợp rất công phu, dễ sai sót, khó nhận ra như thế nào là
thích hợp, đòi hỏi nhiều thời gian suy nghĩ. Đồng thời không phải lúc nào kết
hợp lời giải của các bài toán con cũng cho kết quả của bài toán lớn hơn.
Khi bảng lưu trữ đòi hỏi mảng hai, ba chiều… thì khó có thể xử lý dữ liệu
với kích cỡ mỗi chiều lớn đến hàng trăm.
Có những bài toán tối ưu không thể giải được bằng quy hoạch động.
Tóm lại: Không phải lúc nào việc kết hợp các bài toán con cũng cho ta kết
quả của bài toán lớn hơn. Hay nói cách khác là việc tìm kiếm "công thức truy
hồi" rất khó khăn. Ngoài ra, số lượng các bài toán con cần lưu trữ có thể rất lớn,
không chấp nhận được vì dữ liệu và bộ nhớ máy tính không cho phép.
2.3.1.4. Bài toán balo 0-1
a. Phát biểu bài toán
Cho một cái ba lô có thể đựng một trọng lượng M và n đồ vật, mỗi đồ vật i
có một trọng lượng wi và một giá trị vi. (M, wi và vi là số nguyên dương) Tìm
một cách lựa chọn các đồ vật đựng vào ba lô, chọn các loại đồ vật nào, mỗi loại
lấy bao nhiêu sao cho tổng trọng lượng không vượt quá M và tổng giá trị là lớn
nhất.
b. Thuật giải

Xây dựng công thức
- Bài toán con: F[i, j] là giá trị lớn nhất có thể có bằng cách chọn trong các

đồ vật {1, 2, …, i} với giới hạn trọng lượng j.
- Tham số: 2 tham số i và j, i = 0..n, j = 0..M;
- Công thức truy hồi:
4


Với giới hạn trọng lượng j, việc chọn tối ưu trong số các đồ vật {1, 2, …, i1, i} để có giá trị lớn nhất sẽ có hai khả năng:
+ Nếu trọng lượng hiện tại của ba lô là j nhỏ hơn trọng lượng của đồ vật i
là wi (jcó thể chọn bằng cách chọn trong số các đồ vật {1, 2, …, i-1) với giới hạn trọng
lượng j, tức là:
F[i, j] = F[i-1, j]
+ Nếu trọng lượng hiện tại của ba lô là j lớn hơn hoặc bằng trọng lượng
của đồ vật i là wi (j≥wi) thì ba lô có thể chứa đồ vật thứ i. Khi đó xảy ra hai
trường hợp:
 Nếu chỉ cần sử dụng các đồ vật {1, 2, …, i-1) mà cho tổng giá trị ba
lô lớn nhất thì không cần sử dụng đồ vật thứ i.
 Sử dụng đồ vật thứ i nếu cho tổng giá trị lớn nhất thì F[i, j] bằng giá
trị đồ vật thứ i là v i cộng với giá trị lớn nhất có thể có được bằng các
chọn trong số các đồ vật {1, 2, …, i-1) với giới hạn trọng lượng j-w i.
Tức là về mặt giá trị thu được:
F[i, j] = vi + F[i-1, j-wi]
Theo cách xây dựng F[i, j] là giá trị lớn nhất có thể nên tra sẽ lấy giá trị
lớn nhất trong hai trường hợp trên:
F[i, j] = max(F[i-1, j], vi + F[i-1, j-wi]
Như vậy công thức truy hồi tính F[i, j] là:
0
nếu i = 0 hoặc j = 0
F[i, j] =
F[i-1, j]

nếu j < wi
max(F[i-1, j], vi + F[i-1, j-wi])
nếu j ≥ wi
− Điều kiện đầu: F[0, j] = 0, j = 1..M

F[i, 0] = 0; i = 1..n

Tổ chức dữ liệu
Xây dựng mảng hai chiều F[0..n, 0..M] để lưu lại các giải pháp của các bài
toán con với F[i, j] là giá trị lớn nhất có thể có bằng cách chọn trong các đồ vật
{1, 2, …, i} với giới hạn trọng lượng j.

Truy vết
Bảng phương án gồm n+1 dòng, M+1 cột. Trước tiên ta điền cơ sở quy
hoạch động đó là dòng 0 gồm toàn số 0, sau đó sử dụng công thức truy hồi để
tính dòng 1 trên cơ sở dòng 0 đã có, dùng dòng 1 để tính dòng 2,…, đến khi tính
hết dòng n. Sau khi tính xong bảng phương án thì giá trị F[n, M] thu được chính
là giá trị lớn nhất khi chọn trong các n đồ vật với giới hạn trọng lượng M.
Nếu F[n, M] = F[n-1, M] thì tức là không chọn đồ vật thứ n, ta truy tiếp
F[n-1, M].
Nếu F[n, M] ≠ F[n-1, M] thì ta thông báo rằng phép chọn tối ưu có chọn đồ
vật thứ n và truy tiếp F[n-1, M-wn].
Cứ tiếp tục cho tới khi truy lên tới hàng 0 của bảng phương án.
Như vậy, thuật toán quy hoạch động cho bài toán cái ba lô như sau:
5


Procedure BALO_qhd;
Begin
Fillchar(F[0],sizeof(F[0]),0);

For i:=1 to n do
For j:=1 to M do
begin
F[i,j]:=F[i-1,j];
if (j>=w[i]) and (F[i,j] < F[i-1,j-w[i]]+v[i]) then
c. Độ phức tạp
thuật toán
F[i,j]:=F[i-1,j-w[i]]+v[i];
end;
End;
Thuật toán tính mảng n x M phần tử bởi hai vòng lặp lồng nhau nên độ
phức tạp là O(nM).
d. Ví dụ
Ta có một ba lô có trọng lượng là 5 và 4 loại đồ vật với trọng lượng và giá
trị tương ứng được cho trong bảng bên.
Bảng 2.1. Thông số các đồ vật
Loại đồ vật
Trọng lượng
Giá trị
1
2
3
2
3
4
3
4
5
4
5

6
Dựa vào công thức truy hồi ta tính các giá trị F[i, j] thu được bảng phương
án như sau:
Theo bảng phương án thì F[4, 5] = 7, chính là giá trị lớn nhất khi chọn
trong 4 đồ vật.
Ta thấy F[4, 5] = F[3, 5], tức là ta không chọn đồ vật thứ 4
F[3, 5] = F[2, 5], tức là ta không chọn đồ vật thứ 3
Truy tiếp, ta thấy F[2, 5] ≠ F[1, 5] nên ta thông báo chọn đồ vật thứ 2 và
truy tiếp F[n-1, M-wn] chính là F[1, 2].
Tiếp theo, ta thấy F[1, 2] ≠ F[0, 2] nên ta thông báo chọn đồ vật thứ 1, truy
tiếp đến F[0, 0] thì dừng.
Như vậy loại đồ vật được sử dụng là loại 1 và 2 với tổng giá trị lớn nhất là
7.
2.3.1.5. Bài toán đổi tiền
a. Phát biểu bài toán
Cho n loại tiền giấy có mệnh giá là a 1, a2, …, an. Cần đổi số tiền S. Tìm
phương án đổi S thành ít tờ nhất gồm các loại tiền trên. Mỗi phương án là một
6


bộ (k1, k2, …, kn), trong đó ki là số tờ mệnh giá ai, i = 1..n. Bài toán quy về tìm
bộ (k1, k2, …, kn) sao cho:
k1.a1 + k2.a2 + …+ kn.an = S
và tổng k1 + k2 + … + kn nhỏ nhất.
b. Thuật giải

Xây dựng công thức
− Bài toán con: L[i] là số tờ cần đổi trong cách đổi ít tờ nhất của số tiền i.
− Tham số: 1 tham số i, với i = 0..S;
− Công thức truy hồi:

L[i] = min{L[i - a[k]] + 1 | k = 1..n & i ≥ a[k]}
− Điều kiện đầu: L[0] = 0;

Tổ chức dữ liệu
Xây dựng mảng một chiều L[0..S] với L[i] là số tờ cần đổi trong cách đổi ít
tờ nhất của số tiền i. Khi đó số tờ cần đổi trong cách đổi ít tờ nhất của số tiền S
sẽ là L[S].
Xây dựng mảng a[0..n] để ghi nhận mệnh giá của các đồng tiền. Khi đó a[i]
là mệnh giá đồng i.
Xây dựng mảng KQ[0..S] để ghi nhận lại loại tờ cần đổi

Truy vết
Như vậy dãy L sẽ gồm S+1 ô. Trước tiên ta điền cơ sở quy hoạch động đó
chính là ô đầu tiên sẽ là 0, sau đó ta sử dụng công thức truy hồi để tính tất cả các
ô còn lại.
Sau khi tính xong dãy L thì giá trị L[S] thu được chính là số tờ cần đổi trong
cách đổi ít tờ nhất của số tiền S.
Tại mỗi bước xây dựng dãy L, mỗi khi đặt L[i] := L[i - a[k]] + 1, ta đặt
KQ[i] := k để lưu lại loại tờ tiền k cần chọn trong phương án đổi ít tờ nhất của số
tiền i.
Sau khi tính dãy KQ, ta truy vết:
KQ[S] là loại tờ tiền đầu tiên được chọn,
KQ[S – a[KQ[S]]] là loại tờ tiền thứ hai được chọn,…
Như vậy, thuật toán quy hoạch động cho bài toán đổi tiền như sau:
Procedure DOITIEN_qhd;
Begin
Fillchar (L, sizeof(L), 0);
Fillchar (KQ, sizeof(KQ), 0);
For i:=1 to S do
begin

for k:=1 to n do
if a[k] <= i then
if (L[i] = 0) or (L[i-a[k]] +1 < L[i]) then
begin
L[i] := L[i-a[k]] + 1;
KQ[i] := k;
end;
end;
End;

7


c. Đánh giá độ phức tạp
Thuật toán sử dụng 2 vòng lặp lồng nhau. Vậy độ phức tạp O(Sn).
d. Ví dụ
Cho 3 loại tiền giấy lần lượt có mệnh giá là 1, 2, 4, Cần đổi số tiền S = 10.
Tìm phương án đổi S thành ít tờ nhất gồm các loại tiền trên.
Hai dãy L và KQ sau khi tính sẽ là:
Bảng 2.3. Bảng phương án ví dụ đổi tiền
i
0
1
2
3
4
5
6
7
8

9 10
Số tờ (L[i])
0
1
1
2
1
2
2
3
2
3
3
Loại tờ (KQ[i]) 0
1
2
1
3
1
2
1
3
1
2
Theo bảng phương án, ta thu được L[10] = 3 có nghĩa là với số tiền S = 10
thì ta cần đổi ít nhất là 3 tờ.
Ta có KQ[10] = 2, có nghĩa ta chọn tờ đầu tiên là loại tờ thứ 2 tương ứng
với mệnh giá là 2 (a[2] = 2), như vậy số tiền cần đổi còn lại là 10 – 2 = 8.
Với KQ[8] = 3, ta sẽ chọn tờ thứ 2 là loại tờ thứ 3 tương ứng với mệnh giá
là 4 (a[3] = 4), như vậy số tiền cần đổi còn lại là 8 – 4 = 4.

Với KQ[4] = 3, ta sẽ chọn tờ thứ 3 là loại tờ thứ 3 tương ứng với mệnh giá
là 4 (a[3] = 4), như vậy số tiền cần đổi còn lại là 4 – 4 = 0.
Như vậy với số tiền S = 10 thì ta cần đổi ít nhất là 3 tờ gồm 1 tờ loại 2 và 2
tờ loại 3.
2.3.2. Phương pháp tham lam
2.3.2.1 Khái niệm về phương pháp tham lam
a. Khái niệm
Là một phương pháp dùng để giải quyết bài toán để tìm kiếm lựa chọn tối
ưu ở mỗi bước với hy vọng tìm được tối ưu toàn cục.
b. Nội dung kĩ thuật tham lam
Tham lam theo cách hiểu dân gian là trong một mâm có nhiều món ăn, món
nào ngon nhất ta sẽ ăn trước và ăn cho hết món đó thì chuyển sang món ngon
thứ hai, lại ăn hết món ngon thứ hai này chuyển sang món ngon thứ ba…Kỹ
thuật tham ăn thường được vận dụng giải bài toán tối ưu tổ hợp bằng cách xây
dựng một phương án X. Phương án X được xây dựng bằng cách lựa chọn từng
thành phần Xi của X cho đến khi hoàn chỉnh tức là đủ n thành phần. Với mỗi X i,
ta sẽ chọn Xi tối ưu. Với cách này thì có thể ở bước cuối cùng ta không còn gì để
chọn mà phải chấp nhận giá trị cuối cùng còn lại.
2.3.2.2. Tính chất của phương pháp tham lam
Thành phần then chốt trước tiên là tính lựa chọn tham lam, một giải pháp
tối ưu toàn cục bằng cách lựa chọn tối ưu cục bộ khi có nhiều sự lựa chọn thì ta
có thể lựa chọn phương án nào tốt nhất trong thời điểm hiện tại của bài toán hiện
tại mà không cần quan tâm đến kết quả của giai đoạn sau.
8


Đây là chỗ khác nhau giữa các thuật toán tham lam và quy hoạch động.
Trong quy hoạch động tại mỗi bước ta thực hiện một lựa chọn, nhưng sự lựa
chọn phụ thuộc vào giải pháp cho bài toán con, do đó ta xử lý bài toán quy
hoạch động từ dưới lên (Bottom - Up), nghĩa là xử lý những bài toán nhỏ hơn

đến bài toán con lớn hơn. Đối với giải thuật tham lam ta lựa chọn phương án tốt
nhất ngay lúc đó và giải quyết bài toán con sau khi lựa chọn được thực hiện.
Việc lựa chọn bởi một thuật toán tham lam lựa chọn cho đến thời điểm hiện tại
đó, nhưng nó không thể phụ thuộc bất kỳ trong tương lai hay những giải pháp
cho các bài toán con. Vì vậy không giống như thuật toán quy hoạch giải quyết
bài toán từ dưới lên, mà một thuật toán tham lam giải quyết bài toán từ trên
xuống. Thuật toán tham lam thường đạt hiệu lực khi ta thực hiện lựa chọn trong
bài toán con. Ví dụ trong bài toán chọn hoạt động, giả sử rằng ta có các hoạt
động được sắp xếp sẵn theo thứ tự tăng dần của một thời điểm kết thúc, ta cần
kiểm tra mỗi một hoạt động. Thường là nó đươc xử lí trước khi đưa vào hay sử
dụng một cấu trúc dữ liệu thích hợp (thường là một hàng đợi ưu thế) nên ta có
thể thực hiện lựa chọn tham lam một cách nhanh chóng . Vì vậy với việc lựa
chọn đó sẽ đưa ra một thuật toán hiệu quả.
2.3.2.3. Đặc điểm chung của phương pháp tham lam
Mục đích xây dựng bài toán giải nhiều lớp bài toán khác nhau, đưa ra quyết
định dựa ngay vào thuật toán đang có, và trong tương lai sẽ không xem xét lại
quyết định trong quá khứ. Vì vậy thuật toán dễ đề xuất, thời gian tính nhanh
nhưng có một số bài toán không cho kết quả tối ưu.
Giải thuật tham lam có năm phần:
- Một tập hợp các ứng viên để từ đó tạo ra lời giải.
- Một hàm lựa chọn, theo đó để lựa chọn các ứng viên tốt nhất bổ sung vào
lời giải.
- Một hàm khả thi, dùng để quyết định nếu một ứng viên có thể được dùng
để xây dựng lời giải.
- Một hàm mục tiêu, ấn định giá trị của lời giải hoặc một lời giải chưa hoàn
chỉnh.
- Một hàm đánh giá chỉ ra khi nào ta tìm ra một lời giải hoàn chỉnh.
2.3.2.4. Ưu điểm và hạn chế của phương pháp tham lam
a. Ưu điểm
Áp dụng kĩ thuật tham lam sẽ cho một giải thuật thời gian đa thức. Hơn nữa

việc thiết kế, cài đặt đơn giản.
b. Nhược điểm
Tuy nhiên, sử dụng phương pháp tham lam thì phương án tìm được chưa
hẳn đã là phương án tối ưu và khó để chứng minh thuật toán cho giải pháp tối
ưu.
2.3.3.Nhận xét
Như đã nói ở trên, chìa khóa trong thuật toán quy hoạch động là việc xây
dựng các bài toán con mà ta gọi là mảng quy hoạch động. Mảng này có thể là 1,
2 hoặc có thể nhiều chiều tùy thuộc vào lời giải của bài toán phụ thuộc vào các
loại tham số nào. Tiếp đến là cách quy nạp thu gọn bài toán sau mỗi bước, tức là
9


không gian bài toán (kích thước dữ liệu) nhỏ lại, cho đến khi nào ta hoàn toàn có
thể giải được bài toán nhỏ (điểm dừng của quy nạp). Bản chất của công việc này
là ta phải xây dựng được lời giải của bài toán qua các bài toán con, tức là lập
được công thức truy hồi, và dựa vào công thức truy hồi, ta sẽ biết được cần phải
khởi tạo như thế nào.
Trong các phần trên, chúng ta đã khảo sát một số bài toán có thể dùng
thuật toán quy hoạch động để giải quyết một cách hiệu quả. Những vấn đề này
đều liên quan đến bài toán tìm phương án tối ưu để thực hiện một công việc nào
đó và chúng có chung một tính chất là đáp án tốt nhất cho một bài toán con vẫn
được duy trì khi bài toán con đó trở thành một phần trong bài toán lớn hơn.
Thuật toán quy hoạch động thường được áp dụng để giải các bài toán tối
ưu, bài toán đếm, … Vì vậy, nếu giới hạn kích thước dữ liệu của các bài toán tối
ưu lớn và việc sử dụng các thuật toán khác (như duyệt, nhánh cận, ...) có độ
phức tạp thời gian lớn thì chúng ta hãy nghĩ đến thuật toán quy hoạch động.
2.3.4. Một số bài toán khác
2.3.4.1. Triangle
Hãy xem tam giác số dưới đây. Hãy viết

chương trình tính tổng lớn nhất của các số trên
đường đi bắt đầu từ đỉnh và kết thúc đâu đó ở đáy.
Mỗi bước có thể đi chéo xuống phía trái hoặc đi
chéo xuống phía phải.

8
1 0
2 4 4
4 2 6 5

Trong ví dụ trên, đường đi từ 7 đến 3 đến 8 đến 7 đến 5 sẽ tạo ra tổng lớn
nhất là 30.
Dữ liệu: Dòng đầu tiên của file vào ghi số nguyên N (1 ≤ N ≤ 1.000) là số
lượng hàng của tam giác; Dòng thứ i trong số N dòng tiếp theo, ghi các số trên
hàng thứ i của tam giác. Các số ghi cách nhau bởi một dấu cách và có giá trị
trong đoạn từ 0 đến 100.
Kết quả: Ghi ra file ra tổng lớn nhất của các số trên đường đi theo quy tắc
nêu trên.
Ví dụ:
numtri.in
numtri.out
5
30
7
38
810
2744
45265
2.3.4.2. Piggy-Bank
10



Trước khi nhóm ACM có thể làm một việc gì đó thì cần phải chuẩn bị một
ngân sách và sự hỗ trợ tài chính cần thiết. Nguồn thu nhập chính cho việc này là
từ tiền tiết kiệm. Ý tưởng này rất đơn giản: bất cứ khi nào mỗi thành viên của
nhóm ACM có một số tiền nhỏ, họ lấy tất cả các đồng tiền đó và bỏ chúng vào
con lợn đất. Bạn biết rằng, khi bỏ các đồng tiền vào thì không thể lấy các đồng
tiền đó ra nếu không đập vỡ con lợn đất. Sau một khoảng thời gian đủ dài thì sẽ
có đủ số tiền mặt có trong con lợn đất để chi trả mọi thứ cần thiết.
Nhưng có một vấn đề lớn đối với các con lợn đất là không thể xác định có
bao nhiêu tiền ở bên trong. Vì vậy, chúng ta chỉ có thể đập vỡ con lợn thành các
mảnh nhỏ thì mới biết là có bao nhiêu tiền ở bên trong nó. Rõ ràng chúng ta
không muốn tình huống này xảy ra. Tuy nhiên, có một điều mà chúng ta có thể
làm được là cân con lợn đất và ước chừng có bao nhiêu tiền ở trong đó. Giả sử
rằng chúng ta xác định được chính xác trọng lượng của con lợn và chúng ta biết
trọng lượng của tất cả các đồng tiền, thì chúng ta có thể chắn chắn có một lượng
tiền tối thiểu ở trong con lợn. Nhiệm vụ của bạn là phải tìm ra trường hợp xấu
nhất này và xác định lượng tiền tối thiểu trong con lợn đất đó. Chúng tôi cần sự
giúp đỡ của bạn để không có con lợn đất nào bị đập vỡ trước thời hạn.
Dữ liệu: Dòng đầu tiên của file vào chứa hai số nguyên E và F. Các số này
là trọng lượng của con lợn rỗng và con lợn chứa đầy các đồng tiền. Cả hai trọng
lượng là được cho bằng đơn vị gam. Không có con lợn nào nặng quá 10 kg, điều
này có nghĩa là 1 ≤ E ≤ F ≤ 10.000. Dòng thứ hai ghi một số nguyên N (1 ≤ N
≤ 500) là số các đồng tiền khác nhau có thể được sử dụng. Tiếp theo có đúng N
dòng, mỗi dòng mô tả một loại tiền. Mỗi dòng này chứa hai số nguyên P và W
(1 ≤ P ≤ 50.000, 1 ≤ W ≤ 10.000). P là giá trị một đơn vị tiền tệ của loại đồng
tiền này, W là trọng lượng của nó tính bằng gam.
Kết quả: File ra gồm một dòng ghi đúng một số nguyên là lượng tiền nhỏ
nhất có thể có được khi sử dụng các đồng tiền trên để bỏ vào lợn có trọng lượng
ban đầu E (lợn rỗng) để đạt đến trọng lượng F. Nếu trọng lượng của lợn không

thể đạt được đúng bằng F thì ghi ra câu “impossible”
Ví dụ:
pig.in
pig.out
10 110
60
2
11
30 50
16
impossible
2
10 3
20 4
2.3.4.3. Little shop of flowers (IOI ’99)
Bạn muốn sắp đặt cửa sổ hiệu bán hoa của mình sao cho hấp dẫn nhất.
Bạn có M bó hoa, mỗi bó một loại khác nhau và số bó hoa không nhiều hơn số
bình hoa sắp sẵn thành một hàng trên cửa sổ. Các bình hoa được gắn cố định và
11


được đánh số liên tục từ 1 đến N, trong đó N là số bình, theo thứ tự từ trái sang
phải sao cho bình 1 là bình bên trái nhất, còn bình N là bình bên phải nhất. Mỗi
bó hoa được gán một số nguyên duy nhất có giá trị trong khoảng giữa 1 và M và
có thể được cắm vào các bình khác nhau. Số hiệu của các bó hoa có ý nghĩa như
sau: bó hoa i nằm bên trái bó hoa j trong dãy các bình hoa nếu i < j. Ví dụ, giả sử
ta có một bó hoa Đỗ Quyên (có số hiệu là 1), một bó hoa Thu Hải Đường (có số
hiệu là 2) và một bó hoa Cẩm Chướng (có số hiệu là 3). Bây giờ tất cả các bó
hoa phải được cắm vào dãy các bình hoa bảo đảm ràng buộc về thứ tự các số
hiệu. Bó hoa Đỗ Quyên phải cắm vào bình phía bên trái của bình hoa Thu Hải

Đường. Còn bó hoa Thu Hải Đường phải cắm vào bình phía bên trái của bình
hoa Cẩm Chướng. Nếu số bình hoa nhiều hơn số bó hoa thì những bình không
dùng đến sẽ để trống. Mỗi bình chỉ được cắm 1 bó hoa.
Mỗi bình hoa có đặc điểm khác nhau (cũng như bản thân các bó hoa). Vì
vậy, khi một bó hoa được cắm vào bình sẽ có một giá trị thẩm mỹ nhất định,
được biểu diễn bởi một số nguyên. Các giá trị thẩm mỹ được cho trong bảng
dưới đây. Các bình để trống sẽ có giá trị thẩm mỹ bằng 0.
Hoa
1 (Đỗ Quyên)
2 (Thu Hải Đường)
3 (Cẩm Chướng)

1
7
5
-21

Bình hoa
2
3
4
23
-5
-24
21
-4
10
5
-4
-20


5
16
23
20

Theo bảng trên, hoa Đỗ Quyên sẽ rất hấp dẫn khi được cắm vào bình 2,
nhưng sẽ khó coi khi cắm vào bình 4.
Để nhận được hiệu quả thẩm mỹ tốt nhất, bạn phải tìm cách cắm các bó
hoa vào bình tuân theo ràng buộc về thứ tự sao cho tổng các giá trị thẩm mỹ là
lớn nhất.
Dữ liệu: Dòng đầu tiên của file vào chứa hai số M, N (1 ≤ M ≤ N ≤
100). M dòng tiếp theo, mỗi dòng chứa N số nguyên sao cho Aij là số thứ j trên
dòng thứ (i+1), trong đó Aij là giá trị thẩm mỹ đạt được khi cắm bó hoa i vào
bình j (-50 ≤ Aij ≤ 50).
Kết quả: File ra chứa hai dòng, dòng 1 ghi giá trị tổng nhận được theo
cách cắm của bạn; dòng 2 biểu diễn cách cắm như là một danh sách M số, sao
cho số thứ k trong dòng này cho biết bình hoa dùng để cắm bó hoa có số hiệu k.
Nếu có nhiều cách cắm cùng cho giá trị tổng lớn nhất thì đưa ra cách cắm nhỏ
nhất theo thứ tự từ điển.
Ví dụ:
flower.in
flower.out
35
53
7 23 -5 -24 16
245
5 21 -4 10 23
-21 5 -4 -20 20
12



2.3.4.4. Palindrome (IOI2000 - Beijing China)
Xâu đối xứng là xâu mà việc đọc nó từ trái sang phải cũng như từ phải
sang trái. Bạn hãy viết một chương trình, cho trước một xâu và xác định số ký tự
nhỏ nhất cần chèn vào xâu để có được một xâu đối xứng.
Ví dụ, chèn 2 ký tự vào xâu “Ab3bd” sẽ tạo thành một xâu đối xứng
(“dAb3bAd” hoặc “Adb3bdA”). Hơn nữa, việc chèn ít hơn 2 ký tự sẽ không tạo
ra một xâu đối xứng.
Dữ liệu: File vào gồm 2 dòng. Dòng đầu tiên chứa một số nguyên N là độ
dài của xâu vào (3 ≤ N ≤ 5000); Dòng thứ hai chứa một xâu độ dài N. Xâu này
chỉ gồm các chữ cái in hoa từ ‘A’ đến ‘Z’, các chữ cái in thường từ ‘a’ đến ‘z’ và
các chữ số từ ‘0’ đến ‘9’. Các chữ cái in hoa và in thường được xem là khác
nhau.
Kết quả: File ra gồm một dòng chứa một số nguyên là số ký tự nhỏ nhất
cần chèn như mô tả ở trên.
Ví dụ:
palin.in
palin.out
5
2
Ab3bd
2.3.4.5. Truyền tin
Người ta cần truyền n gói tin được đánh số từ 1 đến n từ một điểm phát
đến một điểm thu. Để thực hiện việc truyền tin có thể sử dụng m đường truyền
được đánh số từ 1 đến m. Biết rằng nếu truyền j gói tin theo đường truyền tin i
thì chi phí phải trả là sij (sij là số nguyên dương, sij ≤ 32767; i = 1, 2, ..., m; j =
1, 2, ..., n).
Hãy xác định số lượng gói tin cần truyền theo mỗi đường truyền tin để
việc truyền n gói tin được thực hiện với tổng chi phí phải trả là nhỏ nhất.

Dữ liệu: Dòng đầu tiên chứa hai số nguyên dương n và m (n , m ≤ 100);
Dòng thứ i trong số m dòng tiếp theo chứa n số nguyên dương si1 si2 ... sin, i =
1, 2, ..., m.
Kết quả: Dòng đầu tiên chứa S là tổng chi phí phải trả theo cách truyền tin
tìm được; Dòng thứ hai chứa m số nguyên không âm q1 q2 ... qm, trong đó qi là
số gói tin cần truyền theo đường truyền tin i.
Ví dụ:
ttin.in
ttin.out
33
4
20 20 20
021
4 3 10
1 3 20
2.3.4.6. Coin
Giả sử tại một lúc nào đó bạn có N loại tiền kim loại (dạng đồng xu) được
đánh số từ 1 đến N, mỗi loại có số lượng đồng không giới hạn. Mỗi đồng của
loại tiền kim loại thứ i mang giá trị vi xu và có trọng lượng wi gam. Vì các loại
tiền được đúc bằng các kim loại khác nhau nên có thể có những loại tiền cùng
13


giá trị hoặc cùng trọng lượng nhưng không thể đồng thời có cùng giá trị và trọng
lượng.
Trong số N loại tiền của bạn, hãy chọn ra một số ít nhất M các đồng, sao
cho chúng có tổng giá trị là V xu và tổng trọng lượng là W gam. M sẽ nhận giá
trị 0 nếu không có cách chọn các đồng tiền thoả mãn hai giá trị V và W.
Dữ liệu: Dòng đầu tiên chứa 3 số tự nhiên N, V, W (1 ≤ N ≤ 20; 1 ≤ V,
W ≤ 150); N dòng tiếp theo, dòng thứ i chứa cặp số (vi, wi) là thông tin về một

đồng của loại tiền thứ i (1 ≤ vi, wi ≤ 150).
Kết quả: Nếu không tìm được cách thoả mãn thì chỉ ghi vào file ra số 0.
Ngược lại, ghi ra file ra: Dòng 1: Ghi số M thoả mãn yêu cầu đặt ra; Dòng 2:
Ghi N số nguyên không âm, trong đó số thứ i cho biết số đồng được chọn của
loại tiền thứ i. Các số viết cách nhau bởi một dấu cách. Nếu có nhiều lời giải,
hãy đưa ra lời giải nhỏ nhất theo thứ tự từ điển.
Ví dụ:
coin.in
coin.out
8 141 4
4
11
10110001
21
41
81
16 1
32 1
64 1
128 1
4 11 17
0
12 34 7
8 10
21 9
2.3.4.7. Chiếc túi xách
Một người đi du lịch có n loại đồ vật có trọng lượng và giá trị khác nhau.
Nhưng anh ta chỉ có một túi xách có dung lượng w (có thể chứa được một số đồ
vật sao cho tổng trọng lượng của các đồ vật này nhỏ hơn hoặc đúng bằng w).
Bạn hãy viết chương trình giúp người đi du lịch phải chọn lựa một danh

sách các đồ vật mang đi như thế nào để tổng giá trị đồ vật mang đi là lớn nhất.
Giả thiết mỗi loại đồ vật có đủ nhiều.
Dữ liệu: File vào gồm 3 dòng. Dòng đầu tiên của file vào chứa hai số
nguyên dương n và w (n, w ≤ 1000). Dòng thứ hai ghi n số nguyên dương ai (ai
< 1000, i = 1, 2, ..., n). Dòng cuối cùng ghi n số nguyên dương ci (ci < 100.000,
i = 1, 2, ..., n). Các số trên một dòng cách nhau bởi một dấu cách.
Kết quả: File ra gồm 2 dòng. Dòng thứ nhất ghi tổng giá trị đồ vật mang
đi lớn nhất. Dòng thứ hai ghi n số nguyên cách nhau bởi dấu cách, trong đó số
thứ i là số lượng đồ vật i cần mang theo (i = 1, 2, ..., n). Nếu có nhiều cách mang
đồ vật đều cho tổng giá trị lớn nhất thì ghi ra một cách bất kỳ trong chúng.
14


Ví dụ:
tuixach.in
5 20
12346
1 2 9 8 16

tuixach.out
56
20600

2.4. Hiệu quả của sáng kiến kinh nghiệm:
Qua quá trình giảng dạy của tác giả, và với việc sử dụng phương pháp quy
hoạch động để giải các bài toán tối ưu trong việc giảng dạy, bản thân tác giả
cũng nhận thấy được rằng: đảm bảo cho học sinh có đủ kiến thức, kỹ năng và
giúp học sinh tự tin hơn khi tham gia vào các kỳ thi dành cho học sinh giỏi.
Sau đây là kết quả đối chứng qua việc vận dụng sáng kiến kinh nghiệm
vào giảng dạy bồi dưỡng học sinh giỏi trong các năm học mà tôi có đứng đội

tuyển:
Đạt 1 giải Ba cuộc thi học sinh giỏi Tỉnh năm học 2015-2016
Đạt 1 giải Ba cuộc thi học sinh giỏi Tỉnh năm học 2018-2019
3. Kết luận, kiến nghị:
3.1. Kết luận:
Người giáo viên khi đã chọn nghề dạy học là phải có tâm yêu nghề, tâm
huyết với nghề, để có được kết quả thành công tốt đẹp thì mỗi người giáo viên
luôn tìm tòi, sáng tạo, trăn trở và nổ lực không ngừng với nhiều cách thức và
phương pháp tối ưu nhất theo mình để giảng dạy, bồi dưỡng cho các em.
Phương pháp giảng dạy thì phong phú, kiến thức thì mênh mông rộng lớn
vô cùng, nhất là kiến thức gắn với yêu cầu đề thi của học sinh giỏi. Vì vậy trong
giới hạn của chuyên đề này, tác giả chỉ khiêm tốn đưa ra một vài suy nghĩ về
phương pháp của mình để bồi dưỡng học sinh giỏi có hiệu quả. Đó là những
điều mà tác giả trải nghiệm qua thực tế giảng dạy nhiều năm, và trong công tác
bồi dưỡng học sinh giỏi. Hy vọng rằng những nội dung trong chuyên đề này sẽ
là những thông tin để được các đồng nghiệp trao đổi, thảo luận để mong rút ra
được những kinh nghiệm thực sự quý báu trong công tác bồi dưỡng học sinh
giỏi.
3.2. Kiến nghị:
Thư viện nhà trường cần bổ sung thêm sách tham khảo, các chuyên đề
Bồi dưỡng HSG, Tuyển tập các đề thì Olympic các năm, các tạp chí Tin học và
nhà trường . . . cho giáo viên cũng như cho học sinh tham khảo phục vụ tốt hơn
trong việc giảng dạy và học tập.

XÁC NHẬN CỦA
THỦ TRƯỞNG ĐƠN VỊ

Thanh Hóa, ngày 23 tháng 05 năm 2019
Tôi xin cam đoan đây là sáng kiến kinh
15



nghiệm của mình viết, không sao chép nội dung
của người khác.
Người viết

Trịnh Thị Hồng Lý

16



×