1. Trang chủ
  2. » Công Nghệ Thông Tin

Phương Pháp Quy Hoạch Động

34 461 4
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 34
Dung lượng 3,48 MB

Nội dung

Trang 1

—-000-—-

SLL _ ố.ằố ẽ.Ắ ẽ _.ễ —.ễẳ ằ.ố.ễ.—ễẳẽ

; NGUYEN KHAC NHO

‘+ TUNG BUOC LUA CHON, CAITIEN _ :

Trang 3

Se En i in in i, i A i i i i a

NGUYEN KHAC NHO

BÀI TOÁN TỐI ƯU DƯỚI GểC NHèN 3 THUẬT TOÁN KINH ĐIỂN

NHÁNH CẬN-THAM LAM- QUY HOẠCH DỘNG FHAM > LAM QUY ô a HOACH - ĐỌNG TH BÀI TOAN TOI L† ý a NHANH CAN Nam 2011 6s se SE SE ES EE ES SE EEE EE EE EO EE EE EE EE EE SS EE SS SE ES SSE +đ.eđ tđ—tâe—-đ tđ tđ.-.tâe—tđ-:.tâ—-âđ—t tđ tâđe—đ-—tâ—-tđ—€đ đâ—tđe-đe—tđ—t-t-ât:-tâeđ—t tâeđ—-t tâ—â-te te tâe—tâe-te-te—-t-t te—-te-âe-e-te tâe—-tđ—-tđe-t:-tđ:-tâe—-tâ-đ-.t-œ

Ru Uw wD uu uD aR aD ca ca s69 cfcc 2 c.cf0cc c9 ccí sac acc í9ccfsc6c9 x9 cíc.í9ccícc 9c 6c ísc9ca9x=/P

ĐƯỢC SỰ CHO PHẫP CỦA TÁC GIÁ CHÚNG TễI XIN ĐƯỢC GIỚI THIỆU TỚI BẠN ĐỌC TÀI LIỆU:

Lí THUYẾT QUY HOẠCH ĐỘNG VÀ ÁP DUNG TÀI LIỆU GềM 3 ẤN PHẨM:

+ MINH HỌA BẮNG NGễN NGỮ PASCAL + MINH HỌA BẰNG NGễN NGỮ C++

+ VIET BANG TIENG ANH (DÀNH CHO GV VÀ HS HỌC TIN BẰNG TA)

Chỳ ý: Việc cài đặt thuật toỏn được đơn giản húa và tường mỉnh đến cực độ, giỳp bạn đọc dễ hiểu nhất

Trang 4

+ Phõn tớch, đỏnh giỏ: Lý thuyết tụng hợp

+ Phõn tớch, đỏnh giỏ: Gần 30 bài toỏn quy Hoạch Động

+ Đỏnh giỏ, hướng dẫn, giải chỉ tiết, phõn loại gần 30 bài toỏn Quy Hoạch Động điễn hỡnh +1CD: Bao gồm code và test kiểm tra gần 30 bài toỏn (1 bài 10 test)

+ Cỏc bạn cú nhu cầu về tài liệu này xin liờn hệ qua địa chỉ email: quyhoachdong(@)gmail.com

Cỏc bạn cú thộ liờn hệ trực tiếp với tỏc giả qua email: nhocqt@gmail.com hoac sdt: 01694449904 (chỳ ý nhắn tỉn trước khi gọn)

MOT SO NOI DUNG TRONG TAI LIEU

-000

Trang 6

Lời núi đầu

Trong cỏc kỳ thi học sinh giỏi tin học như: Olympic 30⁄4: Học sinh giỏi quốc gia:

Olympic tin học quốc tế 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

Cú rất nhiều phương phỏp đề giải quyết lớp cỏc bài toỏn tụi ưu như: Phương phỏp nhỏnh can, phương phỏp tham lam, phương phỏp quy hoạch động (QHĐ) Tựy từng bài toỏn cụ

thộ mà ta chọn I phương phỏp đề ỏp dụng nhằm đạt được hiệu quả (hiệu quả về phộp tớnh toỏn (tốc độ) hiệu quả về bộ nhớ) tốt nhất Trong đú phương phỏp QHĐ luụn được ưu tiờn

lựa chọn vỡ tớnh hiệu quả của chỳng cao hơn cỏc phương phỏp khỏc trong đại đa số cỏc bài toỏn về tụi ưu húa

Phương phỏp QHĐ là một phương phỏp khú bởi vỡ: Mỗi bài toỏn tối ưu cú một đặc thự riờng, cỏch giải hoàn toàn khỏc nhau, cho nờn cỏch ỏp dụng phương phỏp QHĐé cho cỏc bài toỏn cũng hoàn toàn khỏc nhau khụng cú khuõn mẫu chung cho tắt cả cỏc bài

Phương phỏp QHĐ là phương phỏp giải quyết tốt cỏc bài toỏn về tụi ưu húa nú cũng cũn được ỏp dụng giải quyết một số bài toỏn khụng phải tối ưu và cũng đem lại hiệu quả cao

Việc xỏc định những bải toỏn như thể nào thỡ cú thờ ỏp dụng được phương phỏp QHĐ vẫn

cũn rất khú khăn cho rất nhiều người

Cho nờn đờ giải quyết được nhiều bài toỏn khỏc nhau bằng PP QHĐ thỡ đỏi hỏi người lập

trỡnh phải nắm vững bản chất của PP QHĐ Với tài liệu này hớ vọng sẽ giỳp bạn đọc làm chủ được PP QHĐ một cỏch tự nhiờn nhất

Trong tải liệu này cú sử dụng một số tải liệu tham khảo trờn internet, một số cuốn sỏch

chuyờn tin, một số tải liệu trong vả ngoải nước

Xin chõn thành cảm ơn

Edited by: Nguyễn Khắc Nho Ey

Trang 7

Muc Luc

CHUONG lI: PHƯƠNG PHÁP QUY HOẠCH ĐỘNG 5-55 4 I Khai niộm về phương phỏp quy hoach dong (QHD) :sssessssennsssressesnesesneneneneenens 4

1L Gỏc bước thang: tiie cary Hicipcls Aang oii caso cscccccsccanica sscoseosoansssbcabesasasscecsacsescasbooss 5

III Cac thao tộc tong quat cla phurong phap QHD .ccssssssssneesneesneesnenneesnecensenneeens 6

IV Blige ta alan NN OIE kẻ íỲŸƑŸƑ————iiiii=e 7

CHUONG 2: NHAN DIEN CAC BAI TOAN CO THE GIAI DUOC BANG PP QHD 8

1 Cỏc bài toỏn khụng phải là bài toỏn tối ưu húa 25c c2csccvsscvveesrvsrrrrrsrrre Đ BÀI vài cỏc bài biờn KẾ ve aa——ẪŸ.ŸŸ-Ÿ-ŸỶ.ŸỶ-Ỷ e H

CHƯƠNG 3: MỘT SỐ DẠNG ĐIỆN HèNH CÁC BÀI TOÁN GIẢI BẰNG PP QHĐ 17

HAY: KIE HAT TUẦN CÀ T222 eas 18

Trang 8

CHƯƠNG 2: NHẬN DIỆN CÁC BÀI TOÁN Cể THẾ GIẢI ĐƯỢC BẰNG PP QHĐ

L Cỏc bài toỏn khụng phải là bài toỏn tối ưu húa

Cỏc bài toỏn cú thờ ỏp dụng được phương phỏp QHĐ thỡ phải cú tớnh chất: “cỏc bai todn

con phi chộng”

Cú nghĩa là một bài toỏn cú thộ 4p dung phuong phap QHD thi một thuật toỏn đệ quy cho bài toỏn sẽ giải quyết lặp lại cỏc bài toỏn con tương tự, thay vỡ luụn phỏt sinh bài toỏn con

mới Khi một thuật toỏn đệ quy ghộ thăm hoải cựng một bài toỏn con, ta núi rằng bài toỏn cú

“cỏc bài toỏn con phủ chồng” Ngược lại bài toỏn thớch hợp với cỏch tiếp cận chia đờ trị thường phỏt sinh cỏc bài toỏn con hoàn toàn mới tại mỗi bước đệ quy Cỏc thuật toỏn lập trỡnh động thường vận dụng cỏc bài toỏn phủ chồng bằng cỏch giải quyết từng bài toỏn con

một rồi lưu trữ kết quả trong một bảng ở đú nú cú thờ được tra cứu khi cần

Vớ dụ 1: Bài toỏn tỡm tớnh phõn tử thứ n của dóy Fibonacci:

Dóy Fibonacci là dóy vụ hạn cỏc số tự nhiờn bắt đầu bằng hai phần tử ỉ và 1, cỏc phần tử

sau đú được thiết lập theo quy tắc mỗi phần tử luụn bằng tổng hai phan tử trước nú Cụng

thức truy hỏi của diy Fibonacci 1a: Ũ, khi zĂ = 0; & = F(n) = $ L, khi 3 = 1; F{n—1)+#(n-2) — Khi n >1 Sơ đỏ gọi đệ quy với bài toỏn tớnh F(6):

Ta thấy bài toỏn F(6) sẽ gọi bài toỏn F(5) và bài toỏn F(4) Cả bài toỏn F(5) và bài toỏn

F(4) đều gọi bài toỏn F(3) hai bài toỏn con F(4) và F(3) lại cựng goi bai toỏn con F(2) ta

gọi đú là tớnh chất “Bài toỏn con phủ chồng”

Một cải đặt đơn giản của một hàm tớnh phần tử thứ „ của dóy Fibonacci trực tiếp dựa theo định nghĩa toỏn học Cai đặt này thực hỉ ện rất nhiều tớnh toỏn thừa

function fib(n)

Edited by: Nguyễn Khắc Nho E—

Trang 9

ifn=Oorn=1

return n

else

return fib(n-1) + fib(n-2)

Lưu ý rằng nếu ta gọi chăng hạn: fib(5), ta sẽ tạo ra một cõy cỏc lời gọi hảm trong dộ cỏc hàm của cựng một giỏ trị được gọi nhiều lần:

1 fib(5) 2 fib(4) + fib(3)

3 (fib(3) + fib(2)) + (fib(2) + fib(1))

- ((fib(2) + fib(1)) + (fib(L) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) 5 (((fib(1) + fib(O)) + fib(1)) + (fib(1) + fib(O))) + ((fib(1) + fib(O)) + fib(1))

Áp dụng thuật toỏn QHĐ: Ta dựng một bảng đề lưu trừ tắt cả cỏc bài toỏn con, như thộ mỗi bài toỏn con chỉ phải tớnh một lần pay Cal dat: Begin A[0]:=0; A[1]:=1; For i:=2 ton do A[i]:=A[t-2] + Afi-1]; End

Vớ du 2: Bài Toỏn: Mờ Cung (đẻ chọn đội tuyờn tin Olympic 10 trường THPT chuyờn

Quang Trung nam 2010- 2011)

Phỏt biểu bài toỏn: Trong một chuyờn thỏm hiểm mạo hiểm, một đoàn thỏm hiểm khụng may lọt vào một mờ cung với nhiều cạm bẫy Trong mờ cung đú chỉ cú một lỗi ra duy nhất lỗi ra bao gồm cỏc ụ hỡnh vuụng được xếp thành một hàng dài Muốn đi được ra ngoài mọi người phải bước qua một hàng cỏc ụ hỡnh vuụng đú và phải bước theo quy tắc sau:

e_ Quytắc I: Mối bước chớ cú thờ bước một ụ hoặc hai ụ hoặc ba 6

â Quy tắc 2: Từ người thứ 2 trở đi bước theo quy tắc ! và khụng được trựng với cỏc cỏch bước của tất cả những người trước đú

Hỏi đoàn thỏm hiểm đú cũn lại tối thiờu bao nhiờu người khụng thờ thoỏt ra khỏi mờ cung

đỏ được

Input Data:

- Dong 1 ghi một so nguyộn m (m< 10"*) 14 sộ người trong đoàn thỏm hiểm - _ Dũng 2 ghi một số nguyờn n (n<70) là tụng số ụ vuụng

Output Data: Gom 1 số nguyờn duy nhất là số người cũn lại tối thiờu khụng thờ thoỏt ra khỏi mờ cung

Edited by: Nguyễn Khắc Nho mg

Trang 10

Vidu: | Input.inp Output.out 20 E : Thực chất của bài toỏn là tỡm xem cú bao nhiờu cỏch bước ra ngoài

Cụng thức truy hỏi cho bài toỏn nảy được tớnh như sau: + Đề bước lờn ụ thứ n chỳng ta cú 3 cỏch bước:

Cỏch 1: Bước tới ụ thứ n-3 rồi bước 3 bước nữa Cỏch 2: Bước tới ụ thứ n.2 rồi bước 2 bước nữa

Cỏch 3: Bước tới ụ thứ n-† rồi bước ! bước nữa

+ Theo nguyờn lý cộng chỳng ta cú tụng số cỏch bước tới ụ thứ n: F(n) = F(n- 3)+F(n-2) + F(n-1) trong dộ: F(1)= 1; F(2)= 2; F3(=4)

Chỳng ta thấy bài toỏn xuất hiện rất nhiều “bài toỏn con phủ chồng” như bài toỏn tớnh phan

tứ thứ n của đóy Fibonacci Chỳng ta cú thờ ỏp đụng phương phỏp QHĐ cho bải toỏn này để

Trang 11

BÀI 1: LỚP BÀI TOÁN CÁI TÚI I TONG QUAN

1 Mộ hinh

Trong siờu thị cú n đỏ vật (n<1000) đỏ vat thir i cú trọng lượng là W{i]<1000 và giỏ trị VỊ] <1000 Một tờn trộm đột nhập vào siờu thị, tờn trộm mang theo một cỏi tủi cú thờ mang được tụi đa trọng lượng M (M<1000) Hỏi tờn trộm sẻ lấy đi nhừng đỗ vật nảo đề được tụng giỏ trị lớn nhất

Giải quyết bài toỏn trong cỏc trường hợp sau:

e_ Mỗi vật chỉ được chọn một lần

 Mội vật được chọn nhiều lần (khụng hạn chộ sộ lan) InputData: file văn bản Bag.inp

â Dũng I:n,M cỏch nhau ớt nhất một dau cỏch

 ndong tiếp theo: Mỗi dũng gồm 2 số V„ W, là chỉ phớ và giỏ trị đồ vật thứ Ă OutputData: file văn bản bag.out: Ghi giỏ trị lớn nhất tờn trộm cú thộ lay Example Input Output 515 15 124 22 11 12 410 2 Hướng dẫn giải

Trường hợp mỗi vật được chọn 1 lần

Ta nhận thấy rằng: Giỏ trị của cỏi tỳi phụ thuộc vào 2 yếu tố: Cú bao nhiờu vật đang được

xột và trọng lượng của cỏc vật, do vậy chỳng ta cú 2 đại lượng biờn thiờn Cho nờn hàm mục

tiờu sẽ phụ thuộc vào hai đại lượng biờn thiờn Do vậy bảng phương ỏn của chỳng ta sẽ là bảng 2 chiờu

Edited by: Nguyễn Khắc Nho —]

Trang 12

Goi Ffij] 14 tng giỏ trị lớn nhất của cỏi tỳi khi xột từ vật | đến vật Ă và trọng của cỏi tỳi chưa vượt quỏ j Với giới hạn j, việc chọn tụi ưu trong số cỏc vật {1,2, i-l,i} để cú giỏ trị lớn nhất sẽ cú hai khả năng:

Nếu khụng chọn vật thứ Ă thỡ Fl[i.j] là giỏ trị lớn nhất cú thộ chon trong số cỏc vật

{H.2 i-L] với giới hạn trọng lượng là j tức là:

Flij]:=Fli-1j]

Nếu cú chon vat thir i (phải thỏa điều kiện W{i] < j) thỡ Fli.j| bằng giỏ trị vật thứ Ă là

VỊ] cộng với giỏ trị lớn nhất cú thờ cú được bang cỏch chọn trong sỐ cỏc vật {l.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: KH VINH EU-1ủ- Wiill

Vậy chỳng ta phải xem xột xem nờu chon vat i hay khụng chọn vật Ă thỡ sẽ tốt hơn Từ đú

chỳng ta cú cụng thức truy hồi như sau

e F[0.j]= (hiờn nhiờn) - Bài toỏn con nhỏ nhất

ô_ Flij]=max(Ffi-1j], VỊi|+Fli-1j-WIi]]

Trường hợp mỗi vật được chọn nhiều lần: Tương tự như suy luận ở trờn ta xột:

Nếu khụng chọn vật thứ Ă thỡ F[i.j] là giỏ trị lớn nhất cú thờ chọn trong số cỏc vật

{1.2 i-L] với giới hạn trọng lượng là j tức là:

Flij]:=Fli-Lj]

Nếu cú chọn vat thir i (phải thỏa điều kiện W{i] < j) thỡ Flij] bằng giỏ trị vật thứ Ă là Vi] cong voi gid tri lon nhat cú thờ cú được bằng cỏch chọn trong số cỏc vật {l.2 1} (vỡ

vật Ă vẫn cú thờ được chọn tiếp) với giới hạn trọng lượng j-W|{i] tức là vẻ mặt giỏ trị thu được:

Flij]:=VIi|+Flij-WIill

Do vậy chỳng ta cú cụng thức truy hồi như sau: eâ_ F[0j]=0 (hiờn nhiờn) - Bài toỏn con nhỏ nhất

ô_ Flij]Emaxli-1j] VỊi|+Flij-WIi]]

3 Bảng phương ỏn

Ta xõy dựng bảng phương ỏn dựa trờn cụng thức truy hỏi trờn Đề kiểm tra kết quả cú chớnh xỏc hay khụng (nờu khụng chớnh xỏc chỳng ta xõy dựng lại hàm mục tiờu) Thụng qua cỏch xõy dựng hàm mục tiờu và bảng phương ỏn chỳng ta sẻ định hướng việc truy vết

Trang 13

Bảng phương ỏn: N/M|0|1|2|3|4 |5 |6 |7 |8 |9 |10|11 | 12 | 13 | 14| 15 0 10/0/0/0/0 |0 |0 |0 Ă0 |0 |0 |0 |0 0|)|0 |0 1 |000100/0|0/00|0/0|0/4 4|4/4 2 lo|o|z|2|2 |2 |2 |2 |2 |2 |2 |2 |4 |4 |6 |s # (o|i|2|3|3 |3 |3 |3 |3 |3 |3 |3 |4 |5 |s |? 4 lo|z|3|4|s |5 |5 |5 |5 |5 |5 |5 |3 |s |? |s $ |0 213|4 10/12|13 14 15|15 15|15|15 15|15|15 Vậy chỳng ta cú thể chọn vật 2, 3, 4, 5 Example (truộng hợp mỗi vật được chọn nhiều lần) Input Output 515 124 a 22 11 12 410 Bảng phương ỏn: N/M|0|1|2|3|4 |5 |6 |7 |8 |9 |10|11 | 12 | 13 | Iộ | 15 0 00000000 0/00/00 010/0 1 |00/00010|0 0 0|0 0 |0 |4 4 |4 l4 2 410/0|2|2/4 |4 |6 |6 |8 |8 |10|10|12| 12| 14| 14 3 0/12|3414 |5 |6 |7 |8 |9 |10|11|12413|14| 15 4 0214168 |10|12 14 16|18 20 | 22 |24 26 | 28 | 30 $- 10/2|4|6| 10| 12 | 14 | 16 | 20 | 22 | 24 | 26 | 30 | 32 | 34 | 36 Chỳng ta cú thờ chọn vật 4 (3 lần) và vật 5 (3 lần) 4 Truy vết

Trường hợp I: Trong bảng phương ỏn F[n.m] chớnh là giỏ trị lớn nhất thu được khi chọn

trong cả n vật với giới hạn trọng lượng là M

Edited by: Nguyễn Khắc Nho Em

Trang 14

Nếu f[n.M]=f[n-I.M] thỡ tức là khụng chọn vật thir n, ta truy về f[n-I.M] Cũn nếu f[n,.M]zf[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 về f[n-

1.M-Wn|

Trường hợp 2: Trong bảng phương ỏn F[n,m] chớnh là giỏ trị lớn nhất thu được khi chọn trong cả n vật với giới hạn trọng lượng là M

Nếu f[n.Ml=f[n-I.M] thỡ tức là khụng chọn vật thứ n, ta truy vẻ f[n-I.M] Cũn nếu

Trang 15

for j:=1 tomdo if w[i]<=j then Fli,jJ:=max(Fli-1,j],Fli-1 j-wli]]+v[i]) else F[ij]:=FlIi-lj]: End; ớ } Begin inputdata; process; outputdata; End Il Ap dung

Bài toỏn 1: Farmer - Người nụng dan (IOI 2004) a Phat biộu bài toỏn:

Một người nụng dõn cú một số cỏc cỏnh đồng mỗi mot canh | dong duge bao quanh boi cac hàng cõy bỏch Ngoài ra ụng ta cũn cú một tập cỏc dai đất, mối một đải đất cú một hàng cõy bỏch Trờn cỏc cỏnh đồng và dải đất, xen gitra hai cõy bỏch liờn tiếp ki mot cay dliu Tat ca cỏc cõy bỏch hoặc bao quanh cảnh dong hoặc nằm trờn dải dat và tắt cả cỏc cõy ụliu đều được trụng xen giữa hai cõy bỏch liờn tiếp

Một ngày nọ người nụng dõn bị ốm rất nặng và ụng ta cảm thay minh sap phai đi xa Vài ngày trước khi qua đời ụ ụng đó gọi người con trai lớn nhất đến và núi với anh ta "Ta cho con chon Q cay bỏch bat ky va tat ca cac cõy ụliu nằm giữa hai cõy bỏch liờn tiếp ma con i chọn đều thuộc về con” Người con cú thờ chọn tụ hợp cỏc cõy bỏch bắt kỳ từ cỏc cỏnh đồng và đải đất Vỡ người con rất thớch ụliu nờn anh ta muụn chọn Q cõy bỏch sao cho anh ta thừa hướng nhiều cõy ụliu nhất cú thẻ

Trong hỡnh dưới, giả thiết rằng người con được cho L7 cõy bỏch (Q=17) Đờ cú được sO cay ộliu lớn nhất anh ta phải chọn tất cả cỏc cõy bỏch trong cỏnh đồng 1 và cỏnh đồng 2 2, với cỏch chọn này anh ta sẽ được thừa hưởng 17 cõy ụliu

Cho trước thụng tin về cỏc cỏnh dong và dai đất và số cõy bỏch người con được chọn Bạn hóy viết chương trỡnh xỏc định số cõy ụliu lớn nhất mả người con cú thờ được thừa hưởng

Inputdata: Dữ liệu được cho trong file Farmer.in

Dũng đầu tiờn bao gồm: dau tiờn là số nguyờn Q (0<Q<150000); là số cõy bach ma người con được chọn: sau đú là số nguyờn M là số cỏc cỏnh đồng: tiếp theo là số nguyờn K là số đải đất eâ Dũng thứ hai chứa M số nguyờn NĂ N; Nụ (3< Nụ, Nạ Nụ<150): là số cỏc cõy bỏch trờn cỏc cỏnh đồng e Dong thứ, ba chứa K số nguyờn R R; Ry (2< R,.R; ,R„ <150): là số cõy bỏch trờn đải đất

Chỳ ý: tổng số cõy bỏch trờn cỏc cảnh đồng và dai đất ớt nhất cũng tờn Q

Outputdata: Kết quả đưa ra tệp Farmer.out: Gồm một duy nhất một số nguyờn: Là số cõy ụliu lớn nhất mà người con cú thờ thừa hưởng

Edited by: Nguyễn Khắc Nho Ea

Trang 16

LoS oO Eo Cỏnh đồng 1 cú 13 cõy bỏch Cỏnh đồng 2 cú 4 cõy bỏch Cỏnh đồng 3 cú 8 cõy bỏch â———D——> Dải đất 1 cú 4 cõy bỏch o > o> c oO ———— Dải đắt 2 cú 8 cõy bỏch ° â â â° o oO Dải đất 3 cú 6 cõy bỏch Hỡnh trờn: Vớ đụ vẻ cỏch bỏ trớ cỏc cõy bỏch Example: Farmer.inp Farmer.out 1733 1348 486 b Hướng dẫn giải

De thay ring: Manh dat thir i 6 a, cõy ụliu và giải đất thứ j cú b,~l cõy ụliu Coi cỏc mảnh đất và cỏc giải đất là cỏc “đỏ vật” đồ vật thứ k cú, khối lượng We (sụ cõy bỏch) và giỏ trị Ye

(số cõy ụliu) Nếu k là mảnh dat i i thi w¿=v,=a,, nếu k là dai dat thi w¿=b,, 4.=b)-1) Ta can

Trang 18

Bài toỏn 2: Đụi tiền a Mụ hỡnh

Bạn được cho một tập hợp cỏc mệnh giỏ tien Tap hợp luụn chứa phõn tu mang gia tr |

Mỗi mệnh giỏ cú vụ hạn cỏc đồng : tiờn 1 mang mệnh giỏ đú Cho số tiờn S, hóy tỡm cỏch đụi S thành ớt đồng tiền nhất, sao cho mỗi đồng tiờn cú mệnh giỏ thuộc vào tập hợp đó cho Inputdata: file văn bản đoitien.inp Dừ liệu vào gồm 2 dũng ;

* Dũng 1: Hai số nguyờn dương N (số phần tử của tập hợp mệnh giỏ tiền) và S (số tiền can dội) (1 < N < 100; 1 < S < 10")

ô Dũng 2: N số nguyờn dương biểu thị mệnh giỏ của cỏc phan tử trong tập hợp (giỏ trị khụng vượt quỏ 100)

Outputdata: file văn ban doitien.out: Gồm một số nguyờn duy nhất là số đồng tiền ớt nhất

cú thờ đụi được Example Doitien.inp Doitien.out 2 1m 12 b Hướng dẫn giải

Ta nhận thấy: Nếu coi “khối lượng” là mệnh gia “ ia tri” 1a | thỡ đõy chớnh là bài toỏn cỏi tỳi (trường hợp 2) ở trờn Chỉ cú điểm khỏc là yờu cõu tớnh tụng giỏ trị nhỏ nhất

Trang 20

BÀI 7: LỚP BÀI TOÁN NHÂN MA TRẬN Tiền Đề: Cỏch nhõn 2 ma trận Example: Ă 951 |2 ,|—[Ux3—0x3+3x1) (1x1—0x1+3x0) ot se a> Lol Unie Raw te tut) (atta +t ya) Thuật toỏn: I nộu columns[A] = rows [B] 2 then eror 3 else for i —1 to rows[{A] 4 do for j 1 to columns [B] 5 do C[ij] ôâ 0

6 fork — 1 to columns [A]

7 do C[ij] = C[ij] + A{i.k].B(kjj

8 Return C

Lưu í: Ta chỉ cú thẻ nhõn hai ma trận A và B nếu số lượng cột của A bằng số lượng hàng

hàng của B Nờu A là một ma trậng p x q và B là một ma trận q x r, ma trận kết quả C là một ma trận p x r Tụng số phộp nhõn vụ hướng đề tạo ra ma trận C là pqr

Tớnh chất của phộp nhõn ma trận:

đâ (AB)C=A(BC) (kết hợp)

e (A+B)C=AC+BC (phan phoi bờn phải) â C(A+ B)=CA + CB (phan phdi bờn trỏi)

Đề giảm số phộp nhõn chỳng ta sẻ trỏnh tạo ra cỏc ma trận trung gian cú kớch thước lớn và do phộp nhõn ma trận cú tớnh kết hợp nờn cú thờ đạt được điều này bằng cỏch sử dụng cỏc

dấu đúng mở ngoặc dộ chi ra thứ tự thực hiện cỏc phộp nhõn ma trận

1 Tụng quan 1 Mụ hỡnh

Cho 1 dóy ma trận <A,, A; A,„> Ta muốn tớnh tớch A,A; A„ hóy xỏc định trỡnh tự nhõn (cỏch đặt cỏc dấu ngoặc đơn sao cho hợp lý) để cho số phộp nhõn cần thực hiện là ớt nhất

Trang 21

Như vậy tớnh toỏn theo phộp ngoặc đơn đầu tiộn nhanh hon gap 10 lan Inputdata: file văn bản nhanmatran.inp:

â_ Dũng I: Số nguyờn N (N < 100) cho biết số lượng ma trận

e N dũng tiếp theo: Dũng Ă ghi số dũng và số cột của ma trận thứ Ă (<100)

Chỳ ý: Số dũng của ma trận sau phải bằng số cột của ma trận trước

Outputdata: file văn bản nhanmatran.out: Ghi số lượng phộp nhõn ớt nhất Example Nhanmatran.inp Nhanmatran.out 3 7500 10 100 100 5 5 50 2 Hướng dẫn giải

Ta cú nhận xột như sau: Một phộp ngoặc đơn tối ưu của tớch A,A; A„ sẽ tỏch tớch gitra Ay

va Ay, (IS ken: k 18 vj tri dat dau ngode cho sộ phộp nhan it nhất) (A; ¿)(A;., „) Nghĩa là

với một giỏ trị nao đú của k, trước tiờn ta tớnh toỏn cỏc ma tran À; ¿ và À;„; „ rồi nhõn chỳng với nhau đề được tớch cuỗi cựng A, a

Gọi Flij] là số phộp nhõn ớt nhất đờ tớnh tớch ma trận A; ; (từ ma trận À; đến ma trận Aj trong d6 I< i <j <n) Như vậy F[1.n] là số phộp nhõn ớt nhất đẻ tớch tớnh ma trận A, „ Ta nhận thấy rang:

e_ Nếu i=j thỡ đầy chỉ cú một ma trận A, =A, như vậy khụng cần phộp nhõn nào đề tớnh

tớch cỏc ma trận Do đú F[i¿]:=0

đô NếuĂ<j thỡ Flij]:= Fli,k]+F[k+1,j]+d€,

Chỳ giải: dj s6 dũng của ma trận è cạ số cột của ma trận k, c, số cột của ma trận j

K là một số nằm trong phạm vi từ Ă đến j Bởi vậy ta can phải kiểm tra tắt cả cỏc giỏ trị từ Ă

đến j đờ tỡm ra vị trớ của số k Do vậy chỳng ta cú cụng thức truy hỏi như sau:

â_ Flij]:Z0 nờu i=j

Trang 23

( } Procedure Process; Begin for i:=1 ton do fli,i}:=0; for l:=2 ton do for i:=1 to n-l+1 do Begin jr=iel-l; fli j]:= 100000000; {vộ cing) for k:=i to j-1 do Begin t:=fli,k] +flk+1 j)+pli}.d*p[k].c*plj].c: if t<f[i.j] then flij}:=t: End; End; End; ( } Begin inputdata; process; outputdata; End Il Ap dung

Bài toỏn: Tam giỏc phõn đa giỏc a Phat biộu bài toỏn

Cho P=<v;.vạ vạ Ă> là một đa giỏc lỗi cú N đỉnh và N cạnh (v,va.VạVa V„Vị) Băng cỏc

đường chộo khụng cắt nhau ta cú thờ phõn đa giỏc thành N-2 tam giỏc Hóy xỏc định cỏch

Trang 24

Hỡnh: Hai cỏch phõn một đa giỏc lụi Mọi phộp phõn tam giỏc của da giỏc cú 7 cạnh luụn cú 7-3=4 đường chộo và chia đa giỏc thành 7-2=Š tam giỏc

Inputdata: file văn bản phandagiac.inp gũm:

e_ Dũng I: Số nguyờn M (M<1000) số đường chộo của l đa giỏc

eâ M dũng tiếp theo: Mỗi dũng gồm 3 số a b, c a.b là hai đỉnh khụng kẻ nhau, c là khoảng cỏch giữa hai đỉnh a, b (đường chộo) (a.b,c<100)

Outputdata: file văn bản phandagiac.out: Lưu tụng đường chộo ngắn nhất Example ‹ Phandagiac.inp Phandagiac.out “14 27 1135 147 J1 5 10 '166 246 5 12 6 13 79 57 69 |3 7 10 1465 14711 4179 wv Bộ Wh we b Hướng dẫn giải

Giỏ sử ta cú tớch 6 ma trận được biờu điển như sau: ((A;(A:A:)(A;A‹A,)

Ta cú thờ biờu diễn phộp nhõn 6 ma trận ở trờn dưới dạng cõy như sau:

Edited by: Nguyễn Khắc Nho ca

Trang 25

Ta nhận thấy rằng bài toỏn “tam giỏc phõn đa giỏc” chớnh là bài toỏn tớnh tớch ma trận ở trờn

Gọi Flij] là tụng độ dai cỏc đường chộo khi chia đa giỏc gồm cỏc đỉnh từ Ă đến j thành cỏc

tam giỏc (j>i+3: Vỡ đa giỏc phải cú 4 đỉnh trở lờn) Vậy ta cú cụng thức truy hỏi như sau:

e_ F[ij]=0 với (j<i+3)

Trang 26

BÀI 1: LỚP BÀI TOÁN CÁI TÚI I TONG QUAN

1 Mụ hỡnh

Trong siờu thị cú n đỗ vật (n<1000), đỏ vật thứ Ă cú trọng lượng là W{i]<1000 và giỏ

tri VỊĂ] <1000 Một tờn trộm đột nhập vào siờu thi, tờn trộm mang theo một cỏi tui co the

mang được tụi đa trọng lượng M (M<1000) Hỏi tờn trộm sẻ lấy đi nhừng đồ vật nảo đề được tụng giỏ trị lớn nhất

Giải quyết bài toỏn trong cỏc trường hợp sau: eâ_ Mỗi vật chỉ được chọn một lần

 Mội vật được chọn nhiều lần (khụng hạn chộ sộ lan) InputData: file văn bản Bag.inp

e Dong I1:n, M cỏch nhau ớt nhất một đầu cỏch

eâ ndũng tiếp theo: Mỗi dũng gồm 2 số W,„ Vạ, là chỉ phớ va gid tri dộ vat thir i OutputData: file vin ban bag.out: Ghi giỏ trị lớn nhất tờn trộm cú thộ lay Example Input Output 515 15 124 - -đˆ 2 Hướng dẫn giải

Trường hợp mỗi vật được chọn 1 lần

Ta nhận thấy rằng: Giỏ trị của cỏi tỳi phụ thuộc vào 2 yếu tố: Cú bao nhiờu vật đang được xột va trong lượng cũn lại cỏi tỳi cú thẻ chứa được, do vậy chỳng ta cú 2 đại lượng biờn thiờn Cho nờn hàm mục tiờu sẽ phụ thuộc vào hai đại lượng biến thiờn Do vậy bảng phương ỏn của chỳng ta sẽ là bảng 2 chiờu

Trang 27

Goi Ffij] 14 tng giỏ trị lớn nhất của cỏi tỳi khi xột từ vật | đến vật Ă và trọng của cỏi tỳi chưa vượt quỏ j Với giới hạn j, việc chọn tụi ưu trong số cỏc vật {1,2, i-l,i} để cú giỏ trị lớn nhất sẽ cú hai khả năng:

Nếu khụng chọn vật thứ Ă thỡ Fl[i.j] là giỏ trị lớn nhất cú thộ chon trong số cỏc vật

{H.2 i-L] với giới hạn trọng lượng là j tức là:

Flij]:=Fli-1j]

Nếu cú chon vat thir i (phải thỏa điều kiện W{i] < j) thỡ Fli.j| bằng giỏ trị vật thứ Ă là

VỊ] cộng với giỏ trị lớn nhất cú thờ cú được bang cỏch chọn trong sỐ cỏc vật {l.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: KH VINH EU-1ủ- Wiill

Vậy chỳng ta phải xem xột xem nờu chon vat i hay khụng chọn vật Ă thỡ sẽ tốt hơn Từ đú

chỳng ta cú cụng thức truy hồi như sau

e F[0.j]= (hiờn nhiờn) - Bài toỏn con nhỏ nhất

ô_ Flij]=max(Ffi-1j], VỊi|+Fli-1j-WIi]]

Trường hợp mỗi vật được chọn nhiều lần: Tương tự như suy luận ở trờn ta xột:

Nếu khụng chọn vật thứ Ă thỡ F[i.j] là giỏ trị lớn nhất cú thờ chọn trong số cỏc vật

{1.2 i-L] với giới hạn trọng lượng là j tức là:

Flij]:=Fli-Lj]

Nếu cú chọn vat thir i (phải thỏa điều kiện W{i] < j) thỡ Flij] bằng giỏ trị vật thứ Ă là Vi] cong voi gid tri lon nhat cú thờ cú được bằng cỏch chọn trong số cỏc vật {l.2 1} (vỡ

vật Ă vẫn cú thờ được chọn tiếp) với giới hạn trọng lượng j-W|{i] tức là vẻ mặt giỏ trị thu được:

Flij]:=VIi|+Flij-WIill

Do vậy chỳng ta cú cụng thức truy hồi như sau: eâ_ F[0j]=0 (hiờn nhiờn) - Bài toỏn con nhỏ nhất

ô_ Flij]Emaxli-1j] VỊi|+Flij-WIi]]

3 Bảng phương ỏn

Ta xõy dựng bảng phương ỏn dựa trờn cụng thức truy hỏi trờn Đề kiểm tra kết quả cú chớnh xỏc hay khụng (nờu khụng chớnh xỏc chỳng ta xõy dựng lại hàm mục tiờu) Thụng qua cỏch xõy dựng hàm mục tiờu và bảng phương ỏn chỳng ta sẻ định hướng việc truy vết

Trang 28

Bảng phương ỏn: N/M|0|1|2|3|4 |5 |6 |7 |8 |9 |10|11 | 12 | 13 | 14| 15 0 10/0/0/0/0 |0 |0 |0 Ă0 |0 |0 |0 |0 0|)|0 |0 1 |000100/0|0/00|0/0|0/4 4|4/4 2 lo|o|z|2|2 |2 |2 |2 |2 |2 |2 |2 |4 |4 |6 |s # (o|i|2|3|3 |3 |3 |3 |3 |3 |3 |3 |4 |5 |s |? 4 lo|z|3|4|s |5 |5 |5 |5 |5 |5 |5 |3 |s |? |s $ |0 213|4 10/12|13 14 15|15 15|15|15 15|15|15 Vậy chỳng ta cú thể chọn vật 2, 3, 4, 5 Example (truộng hợp mỗi vật được chọn nhiều lần) Input Output 515 124 a 22 11 12 410 Bảng phương ỏn: N/M|0|1|2|3|4 |5 |6 |7 |8 |9 |10|11 | 12 | 13 | Iộ | 15 0 00000000 0/00/00 010/0 1 |00/00010|0 0 0|0 0 |0 |4 4 |4 l4 2 410/0|2|2/4 |4 |6 |6 |8 |8 |10|10|12| 12| 14| 14 3 0/12|3414 |5 |6 |7 |8 |9 |10|11|12413|14| 15 4 0214168 |10|12 14 16|18 20 | 22 |24 26 | 28 | 30 $- 10/2|4|6| 10| 12 | 14 | 16 | 20 | 22 | 24 | 26 | 30 | 32 | 34 | 36 Chỳng ta cú thờ chọn vật 4 (3 lần) và vật 5 (3 lần) 4 Truy vết

Trường hợp I: Trong bảng phương ỏn F[n.m] chớnh là giỏ trị lớn nhất thu được khi chọn

trong cả n vật với giới hạn trọng lượng là M

Edited by: Nguyễn Khắc Nho Em

Trang 29

Nộu f[n.MJ=f[n-1.M] thi tire 1a khụng chọn vật thứ n ta truy về f[n-1.MỊ Cũn neu

f[n.M]zf[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 vộ f[n-

1.M-Wn|

Trường hợp 2: Trong bảng phương ỏn F[n,m] chớnh là giỏ trị lớn nhất thu được khi chọn trong cả n vật với giới hạn trọng lượng là M

Trang 30

if (wli]<=j) IiIjIEmaw(f[i-LIIJIIIi-LIj-w[ilI+v{il): else flijljJ=fli-1] lj): } } /* — *⁄ int main() inputdata( ): process(); outputdata(); Il Ap dung

Bài toỏn 1: Farmer - Người nụng đõn (IOI 2004)

a Phỏt biểu bài toỏn:

Một người nụng dõn cú một số cỏc cỏnh đồng mỗi một cỏnh đụng được bao quanh bởi cỏc

hàng cõy bỏch Ngoài ra ụng ta cũn cú một tập cỏc dải đất, mỗi một dải đất cú một hàng cõy

bỏch Trờn cỏc cỏnh đồng và dải đất, xen giữa hai cõy bỏch liờn tiếp là một cõy ụliu Tõt cả cỏc Cõy, bỏch hoặc bao quanh cảnh dong hoặc nằm trờn dải đất và tắt cả cỏc cõy ụliu đều được trồng xen giữa hai cõy bỏch liờn tiếp

Một ngày nọ người nụng dan bi 6m rat nặng và ụng ta cảm thấy mớnh sắp phải di xa Vài ngày trước khi qua đời ụ ụng đó gọi người con trai lớn nhất đến và núi với anh ta "Ta cho con chon Q cay bỏch bat ky va tat ca cỏc cõy ụliu nam giữa hai cõy bỏch liờn tiếp mai con đó chọn đều thuộc về con” Người con cú thờ chọn tụ hợp cỏc cõy bỏch bắt kỳ từ cỏc cỏnh đồng và đải đất Vỡ người con rất thớch ụliu nờn anh ta muốn chọn Q cõy bỏch sao cho anh ta thừa hướng nhiều cõy ụliu nhất cú thẻ

Trong hỡnh dưới, giả thiết rằng người con được cho 17 cõy bỏch (Q=17) Đề cú được số cõy ụliu lớn nhất anh ta phải chọn tất cả cỏc cõy bỏch trong cỏnh đồng l và cỏnh đồng 2, với cỏch chọn này anh ta sẽ được thừa hướng 17 cõy ụliu

Cho trước thụng tin về cỏc cỏnh dong va dai dat và số cõy bỏch người con được chọn Bạn hóy viết chương trỡnh xỏc định số cõy ụliu lớn nhất mả người con cú thờ được thừa hưởng

Inputdata: Dừ liệu được cho trong file Farmer.in

Dũng đầu tiờn bao gồm: đầu tiờn là số nguyờn Q (0<Q<150000): là số cõy bach ma người con được chọn: sau đú là số nguyờn M là số cỏc cỏnh đồng: tiếp theo là số nguyờn K là số

dải đất

eâ Dũng thứ hai chứa M số nguyờn ẹNĂ, N¿ , Nụ (3< N¿, N¿ị, , Nụ <150): là số cỏc

cõy bỏch trờn cỏc cỏnh dong

e Dong thir ba chira K sộ nguyộn R),Ro, Rx (2 Ry.Ro, Rx <150): là số cõy bỏch trộn dai dat

Chỳ ý: tổng số cõy bỏch trờn cỏc cỏnh đụng và dai dat it nhat cing bang Q

Edited by: Nguyễn Khắc Nho Ea

Trang 31

Outputdata: Kột qua đưa ra tệp Farmer.out: Gồm một duy nhất một số nguyờn: Là số cõy ụliu lớn nhất mà người con cú thờ thừa hưởng LoS oO Eo Cỏnh đồng 1 cú 13 cõy bỏch Cỏnh đồng 2 cú 4 cõy bỏch Cỏnh đồng 3 cú 8 cõy bỏch â——â—S—câ Dải đất 1 cú 4 cõy bỏch oO Ộ œ â > ° Ộ Ỏỏ Dải đất 2 cú 8 cõy bỏch e â ro O o oO Dai dat 3 cú 6 cõy bỏch Hỡnh trờn: Vớ đụ vẻ cỏch bẻ trớ cỏc cõy bỏch Example: Farmer.inp Farmer.out 1733 1348 486 b Hướng dẫn giải

Dộ thay ring: Manh dat thứ Ă cú a, cõy ụliu và giải đất thứ j cú b,~l cõy ụliu Coi cỏc mảnh dat và cỏc giải đất là cỏc “đỗ vật” đồ vật thứ k cú, khối lượng We (sụ cõy bỏch) và giỏ trị Ye

(số cõy ụliu) Nếu k là mảnh đất Ă thỡ w;=v,z=q, nếu k là dải dat thi w¿=b,, vạ=b,-l) Ta can

Trang 33

int main() ( inputdata{ ); process(); outputdatat ); } Bài toỏn 2: Đụi tiền a Mụ hỡnh

Bạn được cho một tập hợp cỏc mệnh giỏ tiờn Tập hợp luụn chứa han tir mang gia ti I Mỗi mệnh giỏ cú vo han cac dong tiộn mang mệnh giỏ đú Cho số tiờn S hóy tỡm cỏch đụi S thành ớt đồng tiờn nhất, sao cho mỗi dong tiờn cú mệnh giỏ thuộc vào tập hợp đó cho Inputdata: file văn bản đoùtien.inp Dữ liệu vào gồm 2 dũng :

ô Dũng l: Hai số nguyờn dương N (số phần tử của tập hợp mệnh giỏ tiền) và S (số tiờn cần đổi) (1 <N < 100; I < Đ < 10” )

ô Dũng 2: N số nguyờn dương biểu thị mệnh giỏ của cỏc phan tử trong tập hợp (giỏ trị khụng vượt qua 100)

Outputdata: file văn bản đoùitien.out: Gồm một số nguyờn duy nhất là số đồng tiền ớt nhất Doitien.out 2 cú thờ đụi được Example Doitien.inp 2 12 b Hướng dẫn giải

Ta nhận thấy: Nếu coi "khụi lượng" là mệnh giả, “gia trị” là 1 thỡ đõy chỉnh là bài toỏn cỏi tỳi (trường hợp 2) ở trờn Chỉ cú điểm khỏc là yờu cõu tớnh tụng giỏ trị nhỏ nhất

Trang 34

using namespace std; void inputdata{ ) ƒ Ị ifstream fi("doitien.inp"); fi>>n>>s; for(im Ă = è; Ă <= n; i++)ƒt>>w{l]: fi.close( ): void outputdata() f i ofstream fo( “doitien.out”™); fo<<f[n][s]: fo.close(): int mintinit a, int b) / Ị if (a>b)return b else return a; void process() ( for (j=l]:j<=s:j++] f[0]{j]=20M: đvụ cựng for (I=1:i<=n;i++] for (j=i:J<=šs;J+ +) ( !ƒ (j-w{tij>=0) f[t]{jI=min(fTi-1][jJè,f1è[j-w{1]]+ T): else fli} [j]=ffi-1) [i]: int main() ( inputdata{ ) proc âs€( ); ottputdata( ) Ị

Edited by: Nguyễn Khắc Nho

quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động.,quy hoạch động quy hoạch động, quy hoạch động quy hoạch động, quy hoạch

động quy hoạch động,quy hoạch động quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động quy hoạch động,quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,vvquy

hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động, quy hoạch động,v

Ngày đăng: 01/04/2014, 18:56

TỪ KHÓA LIÊN QUAN

w