8
LP TRÌNH = ++THUT TOÁN S 3, 1 - 2 - 2012 Nguyn Hu Đin http://nhdien.wordpress.com Email:[email protected] Mobile: 0989 061 951 PROGRAMMING ALGORITHM HANOI Gii thiu Bn th nghim cho các bn yêu thích lp trình ph thông và thi Olympic tin hc. Tôi có ý đnh lp tp chí đin t vi tên như trên (lp trang web riêng), ni dung các bài ging lp trình và các  bài thi hay. Mi các bn tham gia và cho ý kin. Nhng bài tp sau đây đưc l y t tài li u sưu tm trên mng đưc biên tp và sa đi li vi ni dung áp dng các phương pháp gii ca tin hc. Các bn có các bài hay , sưu tm hay gi cho tôi đ tôi đưa vào danh sách vi tên chú thích ca bn hoc bn sưu tm. C gng c 15 ngày tôi ra mt  bn đ lưu tr. Mi thc mc và yêu cu liên h vi: Nguyn Hu Đin Hanoi University of Science Center for High-Performance Computing 334 Nguyen Trai, Thanh Xuan, Hanoi Office (84-4) 557 2869 Danh sách bài knày Bài 3.1 S Kapreka . . . . . . . . . . . . . . . . 1 Bài 3. 2 T hp . . . . . . . . . . . . . . . . . . . 3 Bài 3. 3 Kh óa vòng . . . . . . . . . . . . . . . . . 5 Bài 3.4 T r ti n . . . . . . . . . . . . . . . . . . . 6 Bài 3.5 Đo n k hôn g g i m dài nh t . . . . . . . 7 Danh sách chương trình 1 S kapreka - kapreka.pas . . . . . . . . . . 3 2 T hp - tohop.pas . . . . . . . . . . . . . 4 3 Khóa v òng - khoavong.pas . . . . . . . . . 5 4 Tr tin - tratien.pas . . . . . . . . . . . . . 7 5 Đo n khôn g gi m - doan kh on gg iam. pa s . 8 Mt s bài trong cun sách ca thày Nguyn Xuân Huy Bài 3.1 (S Kapreka) S Kapreka mang tên nhà toán hc n Đ đưc mô t như sau. Đó là s t nhiên x vit trong h đm B đúng K ch s khác nhau đôi mt x = xx , trong đó xx ln lưt là các s thu đưc bng cách sp li các ch s ca s x theo trt t  gim và tăng dn. V i mi cp g iá tr B K hãy tìm mt s Kapreka. Đnh dng tp vào: Tp văn bn kapreka.inp Dòng đu tiên: hai s B K cách nhau qua du cách, 2 B 10, K < B. Đnh dng tp ra: Tp văn bn kapreka.out S x vit trong h đm B. B d li u trên cho bi t: Trong h đm thp phân ( B = 10), x = 6174 là s Kapreka có 4 ch s (khác nhau đôi mt), x x = 7641 1467 = 6174 = x. Ví d. kapreka.inp kapreka.out 10 4 6174 Li gii 3.1. Ta da vào thut toán t hp Next ca  b àitr ư c, si nhl n l ư t các s K ch s trongh b.L ư u ý rng h đm b s dng b ch s 1..(b 1). Vi mi s x đưc sinh ra theo thut toán Next ta tính hiu  y = xx , trong đó xlà s thu đưc bng cách sp li các ch s ca x theo trt t gim dn x- tăng dn. Nu y ch cha các ch s ca x thì y chính là mt s Kapreka. Do các t hp x đưc sinh ra đã cha các ch s đôi mt khác nhau và đưc sp tăng, nên ta luôn có x = x. Đ tìm hiu ca hai s trong h b ta nên biu din ngưc các s dưi dng mng K phn t nhn các giá

laptrinh-03-2012

Embed Size (px)

Citation preview

8/3/2019 laptrinh-03-2012

http://slidepdf.com/reader/full/laptrinh-03-2012 1/8

LP TRÌNH = ++THUT TOÁNS 3, 1 - 2 - 2012

Nguyn Hu Đinhttp://nhdien.wordpress.com

Email:[email protected]: 0989 061 951

PROGRAMMING

ALGORITHM

HANOI

Gii thiuBn th nghim cho các bn yêu thích lp trìnhph thông và thi Olympic tin hc. Tôi có ý đnhlp tp chí đin t vi tên như trên (lp trangweb riêng), ni dung các bài ging lp trình và các bài thi hay. Mi các bn tham gia và cho ý kin.Nhng bài tp sau đây đưc ly t tài liu sưu

tm trên mng đưc biên tp và sa đi li vi nidung áp dng các phương pháp gii ca tin hc.Các bn có các bài hay, sưu tm hay gi cho tôi đ tôi đưa vào danh sách vi tên chú thích ca bnhoc bn sưu tm. C gng c 15 ngày tôi ra mt bn đ lưu tr. Mi thc mc và yêu cu liên hvi:Nguyn Hu ĐinHanoi University of ScienceCenter for High-Performance Computing334 Nguyen Trai, Thanh Xuan, Hanoi

Office (84-4) 557 2869

Danh sách bài kỳ nàyBài 3.1 S Kapreka . . . . . . . . . . . . . . . . 1Bài 3.2 T hp . . . . . . . . . . . . . . . . . . . 3Bài 3.3 Khóa vòng . . . . . . . . . . . . . . . . . 5Bài 3.4 Tr tin . . . . . . . . . . . . . . . . . . . 6Bài 3.5 Đon không gim dài nht . . . . . . . 7

Danh sách chương trình

1 S kapreka - kapreka.pas . . . . . . . . . . 32 T hp - tohop.pas . . . . . . . . . . . . . 43 Khóa vòng - khoavong.pas . . . . . . . . . 54 Tr tin - tratien.pas . . . . . . . . . . . . . 75 Đon không gim - doankhonggiam.pas . 8

Mt s bài trong cun sách ca thày Nguyn Xuân Huy

Bài 3.1 (S Kapreka) S Kapreka mang tên nhà toánhc n Đ và đưc mô t như sau. Đó là s t nhiên x

vit trong h đm B có đúng K ch s khác nhau đôi mtvà x = x” − x, trong đó x” và x ln lưt là các s thu

đưc bng cách sp li các ch s ca s x theo trt t  gim và tăng dn. Vi mi cp giá tr B và K hãy tìm mts Kapreka.

Đnh dng tp vào: Tp văn bn kapreka.inp

Dòng đu tiên: hai s B và K cách nhau qua du cách,2 ≤ B ≤ 10,K < B.

Đnh dng tp ra: Tp văn bn kapreka.out

S x vit trong h đm B.

B d liu trên cho bit: Trong h đm thp phân(B = 10), x = 6174 là s Kapreka có 4 ch s (khác nhauđôi mt), x − x = 7641 − 1467 = 6174 = x.

Ví d.

kapreka.inp kapreka.out10 4 6174

Li gii 3.1. Ta da vào thut toán t hp Next ca bài trưc, sinh ln lưt các sK chstronghb.Lưuý rng h đm b s dng b ch s 1..(b − 1). Vi mis x đưc sinh ra theo thut toán Next ta tính hiu y = x” − x, trong đó x” là s thu đưc bng cáchsp li các ch s ca x theo trt t gim dn và x” -tăng dn. Nu y ch cha các ch s ca x thì y chínhlà mt s Kapreka. Do các t hp x đưc sinh ra đãcha các ch s đôi mt khác nhau và đưc sp tăng,

nên ta luôn có x = x.

Đ tìm hiu ca hai s trong h b ta nên biu dinngưc các s dưi dng mng K phn t nhn các giá

8/3/2019 laptrinh-03-2012

http://slidepdf.com/reader/full/laptrinh-03-2012 2/8

LP TRÌNH = ++THUT TOÁNS 3, 1 - 2 - 2012

tr trong khong 0..b − 1. Thí d s x = 1234 trong h10 s đưc biu din là x[1..4] = (4,3,2,1).

Gi s x = (x1, x2, . . . , xK)vy = ( y1, y2, . . . , yK). Tatính hiu z = x − y = (z1, z2, . . . , zK) theo qui tc sau:

Tính z = x+ y ∗ +1,trongđó y∗ làdngbù (b− 1)

ca y.

Sau đó ta b đi s nh cui cùng. Dng bù(b− 1) y∗ = ( y1∗, y2∗, . . . , yK∗) casyđưctínhnhưsau: yi∗ = (b − 1) − yi, i = 1..K.

Thí d, tính 9217 − 468 trong h 10. Ta cóx[1..4] = (7,1,2,9), y[1..4] = (8,6,4,0), do đó y ∗ [1..4] = (1,3,5,9). Vy

x − y = x + y ∗ +1

= (7,1,2,9) + (1,3,5,9) + (1,0,0,0)

= (9,4,7,8).

Kt qu là, 9217 − 468 = 8749.

Qui tc trên đưc gii thích như sau. Xét cács trong h đm b. Kí hiu z = b − 1, khi đós (z, z, . . . , z) gm K ch s z chính là bK − 1 và y∗ = (bK − 1) − y. Khi đó,

x − y = x − y + (bK

− 1) + 1 − bK

= x + ((bK − 1) − y) + 1 − bK

= x + y ∗ +1 − bK.

Vic b s nh cui cùng tương đương vi phép tr bK vào kt qu.

Dưi đây là th tc tính hiu z = x − y cho các svit ngưc có ti đa K ch s trong h b.

1 procedure Hieu;

2 var i , c , t : integer;3 begin4 c := 1; { so nho }5 for i := 1 to K do6 begin7 t := x[ i ] + ((b−1)−y[i]) + c;8 z [ i ] := t mod b;9 c : = t div b;

10 end;11 end;

Đ ý rng phép cng hai s mt ch s trong hđm b > 1 bt kì cho s nh ti đa là 1. Ngoài ra docác phép toán div và mod thc hin lâu hơn các phépcng và tr nên ta có th vit li th tc trên như sau.

1 procedure Hieu;2 var i , c , t : integer;3 begin4 c := 1;5 for i := 1 to K do6 begin7 t := x[i ] + (b−1−y[i]) + c;8 if  (t >= b) then9 begin z[ i ] := t − b; c := 1; end

10 else begin z[i ] := t; c := 0; end;11 end;12 end;

Vi s x có K ch s sp tăng tc là dng vitngưc ca x” ta có th thc hin phép tr y = x” − x

 bng các thao tác trên chính x theo hai chiu duytxuôi và ngưc. Khi thc hin phép ly hiu ta cũngđng thi kim tra xem mi ch s ca y có xut hinđúng mt ln trong x hay không. Nu đúng, ta chokt qu là true, ngưc li, ta cho kt qu false. Đ thc hin vic này ta dùng mng d[1..K] đánh du sxut hin ca các ch s trong x và y.

1 ( ∗−−−−−−−−−−−−−−−−−−−−−−

2 y = x’’  − x’ (he dem B)3 −−−−−−−−−−−−−−−−−−−−−−−−∗)4 function Hieu: Boolean;5 var i , c , t : integer;6 begin7 fillchar (d, sizeof (d),0) ; { mang danh dau }8 Hieu := false ;9 { Ghi nhan cac xuat hien cua x[i] }

10 for i := 1 to k do d[x[i ]] := 1;11 c := 1; { c: so nho }12 for i := 1 to k do13 begin14 t := x[i ] + (b − 1 − x[k−i+1]) + c;15 if  (t >= b) then16 begin y[ i ] := t − b; c := 1; end17 else begin y[i ] := t; c := 0; end;18 if  (d[y[ i ]] = 0) then exit;19 if  (d[y[ i ]] = 1) then d[y[i ]] := 0;20 end;21 Hieu := true;22 end;

Dưi đây cung cp 15 thí d đ bn đc test chươngtrình. Kt qu 0 cho bit không tn ti s Kapreka chotrưng hp đó.

Nguyn Hu Đin 2/8 http://nhdien.wordpress.com

8/3/2019 laptrinh-03-2012

http://slidepdf.com/reader/full/laptrinh-03-2012 3/8

LP TRÌNH = ++THUT TOÁNS 3, 1 - 2 - 2012

n B K Đáp s n B K Đáp s1 4 3 132 9 9 5 628532 5 4 0 10 9 6 03 6 3 253 11 9 7 04 6 4 0 12 9 8 05 6 5 41532 13 10 3 4956 8 2 25 14 10 4 61747 8 3 374 15 10 9 8641975328 8 7 6417532

15 thí d v các s Kapreka

Chương trình 1: S kapreka - kapreka.pas1 program kapreka;2 uses crt;3 const mn = 11;4 fn = ’kapreka.inp’; gn = ’kapreka.out’;5 type mb1 = array[0..mn] of byte;6 var x,y,d: mb1;7 b,k,b1,v: integer;8 { −−−−−−−−−−−−−−−−−−−−−

9 b  − he dem10 k  − so chu so 11 b1 − chu so lon nhat trong he b, b1 = b −112 v  − bien kiem soat cho ham Next 13 −−−−−−−−−−−−−−−−−−−−−}14 f ,g : text;

16 procedure Doc;17 begin18 assign(f,fn); reset( f) ;19 readln(f,b,k); close( f) ;20 b1 := b−1;21 { Chu so cao nhat trong he dem b}22 end;

24 function Next: Boolean;25 var i : integer;26 begin27 Next := false ;28 if  (v = 0) then exit;29 x[v] := x[v] + 1;30 for i := v + 1 to k do x[ i ] := x[ i −1] + 1;31 if  (x[k] = b1) then v := v − 1 else v := k;32 Next := true;33 end;34 ( ∗−−−−−−−−−−−−−−−−−

35 y = x’’  − x’ 36 −−−−−−−−−−−−−−−−∗)37 function Hieu: Boolean;38 var i , c , t : integer;

39 begin40 fillchar (d, sizeof (d),0) ;41 Hieu := false ;42 {Ghi nhan cac xuat hien cua x[i] }43 for i := 1 to k do d[x[i ]] := 1;44 c := 1; { c: so nho }45 for i := 1 to k do46 begin47 t := x[i] + (b1 − x[k−i+1]) + c;48 if  (t > b1) then49 begin t := t − b; c := 1; end50 else c := 0;51 if  (d[t] = 0) then exit;52 { t ko xuat hien trong x }53 y[ i ] := t; d[t ] := 0;54 end;55 Hieu := true;56 end;

58 function Kapreka: Boolean;59 var i : integer;60 t : Boolean;61 begin62 Kapreka := true;63 { Khoi tri x la to hop tang nho nhat }64 { x [1.. k] = (0,1,..., k −1) }65 for i := 1 to k do x[ i ] := i−1;66 if  (x[k] = b1) then v := 0 else v := k;67 repeat68 if  (Hieu) then exit;69 until not next;70 Kapreka := false ;71 end;

73 procedure Run;74 var i : byte;75 begin76 Doc;77 assign(g,gn); rewrite(g);78 if  (Kapreka) then79 for i := k downto 1 do write(g,y[i])80 else write(g,0);81 writeln(g); close(g);82 end;

84 BEGIN85 Run;86 END.

Bài 3.2 (T hp)

Nguyn Hu Đin 3/8 http://nhdien.wordpress.com

8/3/2019 laptrinh-03-2012

http://slidepdf.com/reader/full/laptrinh-03-2012 4/8

LP TRÌNH = ++THUT TOÁNS 3, 1 - 2 - 2012

Lit kê các t hp chp K ca N phn t 1..N theo th t t đin tăng dn.

Đnh dng tp vào: Tp văn bn tohop.inp

Dòng đu tiên: hai s N  và K cách nhau qua du cách,1 ≤ N ≤ 9,K ≤ N .

Đnh dng tp ra: Tp văn bn tohop.out

 Mi dòng mt t hp, các s trên cùng dòng cách nhau quadu cách.

Ví d.

tohop.inp tohop.out5 3 1 2 3

1 2 41 2 51 3 4

1 3 51 4 52 3 42 3 52 4 53 4 5

Li gii 3.2. Phương án 1. Ta khi tr cho mngx[1..K] là t hp nh nht(1,2 , . . . ,K). Sau đó ta dùnghàm Next đ sinh ra t hp sát sau ca x. Hàm Next

hot đng theo 2 pha như sau:Pha 1. D. Duyt ngưc t K qua trái b qua

nhng phn t mang giá tr ... N − 2,N − 1, N đngcui mng. Nu sau khi d  x không còn phn tnào thì kt thúc vi Next = false vi ý nghĩa là sátsau t hp x không còn t hp nào. Thí d, nuN = 7,K = 5, x[1..5] = (2,3,5,6,7) thì sau khi d baphn t cui ca x ta thu đưc i = 2, x[1..2] = (2, 3).Điu này cho bit s còn t hp sát sau.

Pha 2. Xp.2.1. Tăng phn t x[i] thêm 1 đơn v. Tip tc vi

thí d trên ta thu đưc x[1..2] = (2, 4)

2.2. Xp tip vào x cho đ K phn t theo trt ttăng dn liên tc. Tip tc vi thí d trên ta thu đưcx[1..5] = (2,4,5,6,7).

Ta s dng phn t x[0] = N  làm lính canh.

1 ( ∗ Pascal, Phuong an 1 ∗)2 ( ∗ a2 + b2 cng hòa ∗)

3 ( ∗ cng hòa xã hi ch nghĩa Vit nam ∗)4 function Next: Boolean;5 var i , j , b : integer;6 begin

7 Next := false ; x [0] := N; //cng Vit nam8 { Pha 1. Do }9 i := k; b := n − k;

10 while (x[i ] = b + i) do i := i − 1;11 if  (i = 0) then exit;12 { Pha 2. Xep }13 x[ i ] := x[ i ] + 1;14 for j := i + 1 to k do x[j] := x[j−1] + 1;15 Next := true;16 end;

Đ phc tp: cho hàm Next: 2N , cho c bài:2N .CK

N  = (2N .N !)/(K!(N − K)!) .

Phương án 2. Ta ci tin hàm Next như sau. Gis sau pha 1 ta thu đưc v trí i tha x[i] = n − k + i.Ta gi v trí này là v trí cp nht và s điu khin nó

thông qua mt bin v. Ta khi tr cho x và v như sau

1 for i := 1 to k do x[ i ] := i ;2 if  (x[k] = n) then v := 0 else v := k;

Sau đó mi ln gi hàm Next ta kim tra

Nu v = 0thì dng hàm Next.

Nu v = 0 ta thc hin pha 2 sau đó chnh li giátr ca v như sau:

Nu x[k] = n thì tc là

x[v..k] = (n − k − v, ...,n − 1, n) thì ln gi Nexttip theo s cp nht ti v trí v − 1, ngưc li, nu

x[k] = n thì ln gi Next tip theo s cp nht tiv trí k. Đ phc tp: cho hàm Next: N . Cho c bài:N .CK

N  = (N .N !)/(K!(N − K)!).

Chương trình 2: T hp - tohop.pas

1 ( ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗∗∗∗∗∗∗

2 To hop chap k cua n phan tu 3 phuong an 2 

4 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗)5 program tohop;6 uses crt;7 const8 bl = #32; mn = 10;9 fn = ’tohop.inp’ ; gn = ’tohop.out’ ;

10 type11 mb1 = array[0..mn] of byte;12 var13 x: mb1;14 n, k, v: byte;

15 f ,g: text;

17 procedure Doc;18 begin

Nguyn Hu Đin 4/8 http://nhdien.wordpress.com

8/3/2019 laptrinh-03-2012

http://slidepdf.com/reader/full/laptrinh-03-2012 5/8

LP TRÌNH = ++THUT TOÁNS 3, 1 - 2 - 2012

19 assign(f,fn); reset( f) ;20 readln(f,n,k); close( f) ;21 end;

23 function Next: Boolean;24 var i : byte;25 begin26 Next := false ;27 if  (v = 0) then exit;28 { Pha 2. Xep }29 x[v] := x[v] + 1;30 for i := v + 1 to k do x[ i ] := x[ i −1] + 1;31 if  (x[k] = n) then v := v − 1 else v := k;32 Next := true;33 end;

35 procedure Run;

36 var i : byte;37 begin38 Doc;39 assign(g,gn); rewrite(g);40 for i := 1 to k do x[ i ] := i ;41 if  (x[k] = n) then v := 0 else v := k;42 repeat43 for i := 1 to k do write(g,x[ i ], bl) ;44 writeln(g);45 until not Next;46 close(g);47 end;

49 BEGIN50 Run;51 END.

Bài 3.3 (Khóa vòng) Mt khóa gm M vòng ch vàN vòng s. Mi vòng ch hoc s cha các giá tr bin thiênt gii hn nh nht a đn gii hn ln nht b. Hãy lit kê tăng dn theo trt t t đin các giá tr có th có ca khóa.

Đnh dng tp vào: Tp văn bn khoa.inp

Dòng đu tiên: hai s t nhiên M và N , 1 ≤ M,N ≤ 5.Dòng th i trong s M + N dòng tip theo: gii hn ai và

bi cho các vòng khóa.Đnh dng tp ra: Tp văn bn khoa.out

Dòng đu tiên: Tng s kh năng.T dòng th hai tr đi: mi dòng mt giá tr khóa lit kê tăng dn theo trt t t đin. Các kí t ch và s trong mikhóa đưc vit lin nhau, không có du cách gia. Các

 giá tr ch đưc ly t bng ch HOA ting Anh.

Ví d.

khoa.inp khoa.out1 2B C2 30 2

12B20B21B22B30B31B32C20C21C22C30C31C32

Li gii 3.3. Phương pháp: duyt toàn b các t

hp. Nu toàn b N vòng khóa đu ch cha các chs vi gii hn bit trưc t cn dưi a[i] đn cn trênb[i], i = 1..N thì ta dùng hàm Next sinh ra ln lưt cáct hp N phn t c[1..N ] như sau.

Khi tr: c[1..N] là t hp nh

nht cha toàn cn dưi:

c[i] := a[i], i = 1..N.

X lí:repeat

Ghi t hp c[1..N];

until not Next;

Mi ln gi hàm Next ta thc hin ging nhưphép đm: Duyt ngưc c[1..N ] vi mi c[i] = b[i]

ta đt li c[i] := a[i]. Gp c[i] đu tiên tha điu kin

c[i] < b[i] thì tăng vòng khóa i thêm 1 nc. Nu không

gp phn t i như vy thì chng t đã x lí xong thp cao nht.

Vic còn li là chuyn các vòng ch sang vòng stương ng.

Đ phc tp: (b1− a1+1)(b2− a2+1)...(bv − av+1), v

Chương trình 3: Khóa vòng - khoavong.pas

1 program khoavong;2 uses crt;3 const mn = 20;

4 bl = #32; nl = #13#10;5 fn = ’khoa.inp’ ; gn = ’khoa.out’ ;6 ChuCai = [’A’..’Z’];7 type mi1 = array[0..mn] of integer;

Nguyn Hu Đin 5/8 http://nhdien.wordpress.com

8/3/2019 laptrinh-03-2012

http://slidepdf.com/reader/full/laptrinh-03-2012 6/8

LP TRÌNH = ++THUT TOÁNS 3, 1 - 2 - 2012

8 var m,n: integer;9 a,b,c: mi1;

10 f ,g : text;11 m: longint ;

13 procedure Doc;14 var i : integer;15 c: char;16 begin17 assign(f,fn); reset( f) ; readln(f,m,n);18 n := m + n;19 for i := 1 to m do20 begin21 repeat22 read(f,c);23 until c in ChuCai;24 a[i] := ord(c) − ord(’A’);25 repeat26 read(f,c);27 until c in ChuCai;28 b[ i ] := ord(c) − ord(’A’);29 end;30 for i := m + 1 to n do read(f,a[i ],b[ i ]) ;31 close( f) ;32 m := 1;33 for i := 1 to n do m := m ∗ (b[i] − a[i] + 1);34 end;

36 function Min(a,b: integer) : integer;37 begin38 if  (a < b) then Min := a else Min := b;39 end;

41 function Next: Boolean;42 var i : integer;43 begin44 Next := false ;45 i := n;46 while (c[i] = b[i]) do47 begin48 c[ i ] := a[i ];49 i := i − 1;50 end;51 if  (i = 0) then exit;52 c [ i ] := c [ i ] + 1;53 Next := true;54 end;

56 procedure Duyet;57 var i : integer;58 begin59 for i := 1 to n do c[i ] := a[ i ];60 c[0] := −1;61 assign(g,gn); rewrite(g); writeln(g,m);62 repeat63 for i := 1 to m do write(g,chr(ord(’A’)+c[i]));64 for i := m + 1 to n do write(g,c[i]);65 writeln(g);66 until not Next;67 close(g);68 end;69 BEGIN70 Doc; Duyet;71 END.

Bài 3.4 (Tr tin) Có N  loi tin mnh giá mi và slưng si , i = 1..N . Xác đnh s lưng mi loi đ có th tr li V đng.

Đnh dng tp vào: Tp văn bn tratien.inpDòng đu tiên: hai s t nhiên N và V , 2 ≤ N ≤ 15.Dòng th hai: N s t nhiên m1,m2, . . . ,mN .

Dòng th ba: N s t nhiên s1, s2, . . . , sN .

Đnh dng tp ra: Tp văn bn tratien.out

N s t nhiên c1, c2, . . . , cN  th hin s lưng t tinmi loi cn tr, c1m1 + c2m2 + . . . + cN mN  = V . Nuvô nghim: ghi s 0.

Trong các tp *.inp và *.out các s trên cùng dòng cách

nhau qua du cách.Ví d.

tratien.inp tratien.out6 1561 2 5 10 20 504 7 2 3 6 2

0 3 0 0 5 1

Li gii 3.4. Đây là loi toán Balo vi d liu nhvì trong thc t s mnh giá không nhiu, thí d, tinVit ch có các loi sau đây là thông dng 100, 200,500, 1.000, 2.000, 5.000, 10.000, 20.000, 50.000, 100.000,200.000, 500.000. Nu tính theo đơn v 100 đng thì tacó th vit li dãy trên cho gn hơn như sau:1, 2, 5, 10, 20, 50, 100, 200, 500, 1.000, 2.000, 5.000.

Ta duyt các t hp s t tin phi tr cho mi loimnh gía, cn dưi là 0 cn trên là min(si, vdivmi) vìđ tr li v đng bng loi mnh giá mi ta dùng ti đa(vdivmi) t.

Nguyn Hu Đin 6/8 http://nhdien.wordpress.com

8/3/2019 laptrinh-03-2012

http://slidepdf.com/reader/full/laptrinh-03-2012 7/8

LP TRÌNH = ++THUT TOÁNS 3, 1 - 2 - 2012

Đ phc tp:

(b1 − a1 + 1)(b2 − a2 + 1)...(bv − av + 1), v = M + N .

Chú ý: Sau này ta s xây dng thut toán tt hơncho bài toán tr tin. Thut toán này da trên mt skin thc s hc.

Chương trình 4: Tr tin - tratien.pas1 program TraTien;2 uses crt;3 const mn = 20; bl = #32; nl = #13#10;4 fn = ’ tratien . inp ’ ; gn = ’ tratien .out’ ;5 type mi1 = array[0..mn] of integer;6 ( ∗−−−−−−−−−−

7 n −so luong cac loai tien8 v  − so tien can tra lai 9 vt  − gia tri tam thoi 

10 m[1..n]  − cac menh gia11 s [1.. n]  − so luong to tien12 c [1.. n]  − so luong can chon13 −−−−−−−−−−−∗)14 var n,v,vt: integer;15 m,s,c: mi1;16 f ,g : text;

18 procedure Doc;19 var i : integer;20 begin

21 assign(f,fn); reset( f) ; readln(f,n,v);22 for i := 1 to n do read(f,m[i]);23 for i := 1 to n do read(f,s[ i ]) ;24 close( f) ;25 end;26 function Min(a,b: integer): tu viet

28 function Next: Boolean;29 var i : integer;30 begin31 Next := false ;

32 i := n;33 while (c[i ] = s[i ]) do34 begin

35 vt := vt − c[i] ∗ m[i];36 c[ i ] := 0;37 i := i − 1;38 end;39 if  (i = 0) then exit;40 c [ i ] := c [ i ] + 1;41 vt := vt + m[i];42 Next := true;43 end;

45 function Duyet: Boolean;46 var i : integer;47 begin48 { Khoi tri }49 for i := 1 to n do50 begin51 s[i] := min(s[i ],v div m[i]);52 c[ i ] := 0;53 end;54 { tong gia tri cua 1 phuong an }55 c[0] := −1; vt := 0;56 Duyet := true;57 repeat58 if  (vt = v) then exit;59 until not Next;60 Duyet := false ;61 end;

63 procedure Run;64 var i : integer;65 begin66 Doc; assign(g,gn); rewrite(g);67 if  (Duyet) then68 for i := 1 to n do write(g,c[ i ], bl) ;69 else writeln(g,0);70 close(g);71 end;72 BEGIN73 Run;74 END.

Bài 3.5 (Đon không gim dài nht) Cho dãy gmN s nguyên. Tìm đon không gim có chiu dài ln nht.

Đnh dng tp vào: Tp văn bn mdoan.inpDòng th nht: s t nhiên N , 1 ≤ N ≤ 20000.T dòng th hai tr đi: các phn t ca dãy.

Đnh dng tp ra: Tp văn bn mdoan.outCha mt dòng duy nht gm hai s t nhiên d - ch sđu đon và L - s phn t trong đon (chiu dài đon).

Trong các tp, d liu trên cùng dòng cách nhau quadu cách.

Ví d.

mdoan.in mdoan.out121 5 5 1 33 3 5 7 91 2

4 7

Nguyn Hu Đin 7/8 http://nhdien.wordpress.com

8/3/2019 laptrinh-03-2012

http://slidepdf.com/reader/full/laptrinh-03-2012 8/8

LP TRÌNH = ++THUT TOÁNS 3, 1 - 2 - 2012

Thí d trên cho ta đon không gim dài nht bao gm7 phn t bt đu t phn t th tư trong dãy (các phnt đưc gch dưi):

1 5 5 1 3 3 3 5 7 9 1 2

Li gii 3.5. Đây là bài d, ta đc dn các phn tt input file và so sánh hai phn t liên tip nhau là

x (phn t đc trưc ti bưc i) và y (phn t đc sauti bưc i + 1). Nu y < x thì coi như kt thúc mtđan không gim, ta cp nht đ ghi nhn li đonkhông gim dài nht. Các bin tng th trong chươngtrình đưc dùng như sau:

MaxLen - chiu dài ca đon không gim dài nhthin tìm đưc,

imax - ch s đu tiên ca đon không gim dàinht hin tìm đưc,

ileft - ch s đu tiên ca đon không gim đangxét.

Đ phc tp: c N.

Chương trình 5: Đon không gim - doankhonggiam.pas

1 program doankhonggiam;2 uses crt;3 const4 bl = #32; fn = ’mdoan.inp’; gn = ’mdoan.out’;5 var f ,g : text;6 n: integer;7 a: mw1;8 iLeft , imax: integer;9 MaxLen: integer;

10 procedure Update(i: integer);11 begin12 if  (MaxLen < i − iLeft) then13 begin14 MaxLen := i − iLeft;15 imax := iLeft ; ileft := i ;16 end;17 iLeft := i;18 end;19 procedure XuLi;20 var i , x , y: integer;21 begin22 assign(f,fn); reset( f) ; readln(f,n);23 read(f,x);24 iLeft := 1; MaxLen := 0;25 for i := 2 to n do26 begin27 read(f,y);28 if  (y < x) then Update(i);29 x := y;30 end;31 Update(n+1);32 close( f) ;33 end;34 procedure Ghi;35 begin36 assign(g,gn); rewrite(g);37 writeln(g,imax,bl,MaxLen);38 close(g);39 end;40 BEGIN41 XuLi; ghi;42 END.

Tài liu

[1] Nguyn Xuân Huy, Sáng to trong thut toán và

lp trình, Tp 1, 2, NXB Thông tin và Truyn

thông, 2010.

[2] Nguyn Hu Đin, Mt s vn đ v thut toán,

NXB Giáo dc, 2006.

Nguyn Hu Đin 8/8 http://nhdien.wordpress.com