You are on page 1of 20

B / Quay lui + vt cn + la chn ti u Kt hp qui I / ngha : Trong nhiu trng hp , nghim ca bi ton l dy cc phn t c xc nh khng theo mt lut tnh

nh ton nht nh, mun tm nghim phi thc hin tng bc ,tm kim dn tng phn t ca nghim . tm mi phn t ,phi kim tra ng,sai cc kh nng c th chp nhn ca phn t ny. + Nu kh nng no khng dn ti gi tr chp nhn c ca phn t ang xt th phi loi b kh nng , chuyn sang chn kh nng khc ( cha c chn ) . Ch : mi khi chn mt kh nng cho mt phn t th thng thng trng thi bi ton s thay i v th khi chuyn sang chn kh nng khc , phi tr li trng thi nh trc khi chn kh nng va loi b (ngha l phi quay lui li trng thi c ). + Nu c 1 kh nng chp nhn c ( ngha l gn c gi tr cho phn t ang xt ca nghim ) v cha l phn t cui cng th tm tip phn t tip theo . + Nu bi ton yu cu ch tm 1 nghim th sau khi chn c 1 kh nng cho 1 phn t ca nghim , ta kim tra phn t ny l phn t cui cng ca 1 nghim hay cha ( gi l lnh kim tra kt thc 1 nghim ). Nu ng l phn t cui cng ca nghim th : Hin nghim v thot hn khi th tc qui bng lnh Halt; Nu bi ton yu cu tm tt c cc nghim th khng c lnh kim tra kt thc 1 nghim + Trong vic th mi kh nng ca 1 phn t ca nghim , nu bit tm nhng iu kin nhanh chng loi b nhng kh nng khng th chp nhn c th vic th s nhanh chng hn. Vic th mi kh nng ca 1 phn t ca nghim cng ging nh mt ngi i ng , mi khi n ng N-ng , ln lt chn 1 ng thch hp trong cc con ng ca ng N-ng , nu bit chc chn nhng ng no trong cc ng ca ng N-ng l ng ct khng th i ti ch th ngi i ng s loi ngay nhng ng ; hoc ngc li nu nhn thy trc nhng iu kin cho php ch cn i theo mt s con ng nht nh trong N ng m vn ti ch nhanh chng th ngi i ng s dng nhng iu kin y nh la bn ch phng hng i ca mnh Tt nhin khi khng nh iu ny l ng ,iu kia l sai phi ht sc thn trng.Nu nhng khng nh chc chn ch l iu ng nhn th c th b st mt s con ng ti ch, hoc chch hng khng th ti ch . Mt tr khn va to bo va chc chn l tr khn ca mt chng trnh sng gi ! + Nu tm 1 nghim tt nht ( theo iu kin ) th mi khi tm c 1 nghim , ta so snh vi nghim tt nht tm c cho n lc ny( gi l nghim ti u ) . Nu nghim va tm c tt hn nghim ti u th gn li nghim ti u l nghim mi Qu trnh tip din cho n khi duyt ht cc nghim ca bi ton ta s c nghim ti u ca bi ton . Tm li thut ton duyt trn c s tm kim v quay lui - Thut ton BackTracking - c cha cc ni dung sau :

+ Vt cn mi nghim bng tm kim tin dn v ch ng thi bit quay lui khi khng th tin + C th t cc mt lc vic tm kim nhanh chng hn : hoc loi b hoc ch chn mt s hng . + C th so snh cc nghim c nghim ti u + Tu theo yu cu , c th ch tm 1 nghim , cng c th tm mi nghim Do thut ton BackTracking xy dng trn c s tm kim dn ,kt qu sau hnh thnh t kt qu trc, nn c th dng cc hm, th tc qui thc hin thut ton C th c 3 dng dn bi thng gp sau y : II / Ba dng qui thng gp thc hin thut ton BackTracking Dng 1 : Tm mi nghim Procedure Tim(k : Integer); Begin Vng lp c mi kh nng ca bc th k trong tm kim 1 nghim Begin + Th chn 1 c cho bc k + Nu c ny chp nhn c th Begin * Ghi nhn gi tr c; * Lu trng thi mi ca bi ton sau c; * Nu cha phi bc cui cng th Tim(K+1) Else {l bc cui cng} th Hin Nghim; * Tr li trng thi ca bi ton trc khi c; End; End; End; Cng c th vit di dng sau : Procedure Tim(k : Integer); Begin Nu bc k l bc sau bc cui cng th Hin nghim ; Vng lp c mi kh nng ca bc th k trong tm kim 1 nghim Begin + Th chn 1 c cho bc k + Nu c ny tho mn bi ton th Begin * Ghi nhn gi tr c; * Lu trng thi mi ca bi ton sau c; * Tim(k+1); * Tr li trng thi ca bi ton trc khi c;

End; End; End; Th d : Bi ton con m i tun ( Hin tt c cc nghim) Cch 1 : Program Madequy; Uses Crt; Const Max = 8; Fi = 'madq.inp'; D : Array [1..8] of -2..2 = (-2,-2,-1,1,2,2,1,-1); C : Array [1..8] of -2..2 = (-1,1,2,2,1,-1,-2,-2); Var F : Text; T1,T2 : longint; A : Array[1..Max,1..Max] of Integer; x,y,k,dem,n,nsq : Integer; Procedure DocFi; Begin Assign(F,Fi); {$I-} Reset(F); {$I+} If Ioresult<>0 then Begin Writeln('Loi File '); Readln; Halt; End; Readln(F,N); Nsq := N*N; Readln(F,x,y); Close(F); End; Procedure Hien; Var i,j : Integer; Begin Inc(dem); Assign(F,Fi); Append(F); {Ghi nghim ngay cui File d liu Input } Writeln(F,'Nghiem thu ',dem); For i:=1 to N do Begin For j:=1 to N do Write(F,A[i,j]:3); Writeln(F); End; Close(F); End; Procedure Try(k:Integer;x,y: Integer); Var i,j,u,v : Integer; Begin If k > nsq then Hien Else For i:=1 to 8 do Begin u:=x+D[i]; v:=y+C[i];

If (u in [1..n]) and (v in [1..n]) and (A[u,v]=0) then Begin A[u,v]:=k; try(k+1,u,v); A[u,v]:=0; End; End; End; BEGIN Clrscr; Fillchar(A,Sizeof(A),0); dem:=0; DocFi; A[x,y]:=1; Try(2,x,y); END. Cch 2 : ( Chuyn mng 2 chiu sang 1 chiu , hiu sut hn ) Uses Crt; Const N = 12; Type Mt = Array[1..(n+4)*(n+4)] of Integer; Var x : Mt; K : Array[1..8] of Integer; db,spt,d,c,L,z : Integer;{db :so o dau bang } Procedure Khoitao; Var i,j,all : Integer; Begin db := 2*(L+4)+2; all := (L+4)*(L+4); For i:=1 to all do X[i] := 1; For i:=1 to L do For j:=1 to L do X[db+(i-1)*(L+4)+j] := 0; X[db+(d-1)*(L+4)+c] := 1; K[1] := 2*L+9; K[2] := 2*L+7; K[3] := L+6; K[4] := L+2; K[5] := -K[4]; K[6] := -K[3]; K[7] := -K[2]; K[8] := -K[1]; z := 0; { So nghiem } spt:= L*L; End; Procedure Hien; Var i,j : Integer; Begin Inc(z); Writeln('Nghiem : ',z); For i:=3 to L+2 do Begin For j:=3 to L+2 do Write(X[(i-1)*(L+4)+j]:3); Writeln;

End; End; Procedure Tim(t,p : Integer);{ Di toi o thu t,ma dang o o thu p cua x } Var i : Integer; Begin If t=spt then Hien ; For i:=1 to 8 do If x[p-k[i]]=0 then Begin x[p-k[i]] := t+1; Tim(t+1,p-k[i]); x[p-k[i]] := 0; End; End; BEGIN Clrscr; Write('Kich thuoc ban co : '); Readln(L); Write('Nhap 2 toa do o xuat phat : '); Readln(d,c); Khoitao; Tim(1,db+(d-1)*(L+4)+c); If z=0 then Writeln('Khong co nghiem '); END.

Dng 2 : Tm mt nghim : Procedure Tim(k : Integer); Begin Vng lp c mi kh nng ca bc th k trong tm kim 1 nghim Begin + Th chn 1 c + Nu c ny chp nhn c th Begin * Ghi nhn gi tr c * Lu trng thi mi ca bi ton sau c * Nu l bc cui cng th Begin

Hin Nghim Thot End * Tr li trng thi trc khi c End; End; End; Hoc c th vit di dng sau : Procedure Tim(k : Integer); Begin Nu l bc sau bc cui cng th Begin Hin Nghim Thot End Cn khng : To vng lp c mi kh nng ca bc th k trong tm kim 1 nghim Begin + Th chn 1 c + Nu c ny tho mn bi ton th Begin * Ghi nhn gi tr c * Lu trng thi mi ca bi ton sau c * Nu cha phi bc cui cng th Tim(K+1) * Tr li trng thi ca bi ton trc khi c End; End; End; Trong bi ton tm 1 nghim , ngi ta thng a thm vo cc iu kin i vi cc kh nng c b bt i 1 s kh nng c hoc lm cho kh nng c thu hp li Th d : + iu kin cn mt kh nng c chp nhn bc th i l bc i+1 cng c kh nng chp nhn mt c ca n v bc th i cha phi bc cui cng . V vy c th nhanh chng ti ch nu a ra qui lut chn c ca bc th i nh sau : bc th i ta s chn c no m theo n a ta ti bc i+1 c t kh nng chp nhn nht ( ngha l bc th i+1 vn c kh nng c ca n , nhng s c t ) + Mt cch khc : Khi chp nhn mt kh nng c cho bc th i , c th s tc ng ti trng thi bi ton . V vy ta tnh ton trc nu chn c ny th trng thi bi ton c thay i qu mc gii hn cho php hay

khng ?.Ngha l c vt qua cn trn hoc cn di ca bi ton hay khng ? Nu vt qua th ta khng chn c y Trong nhiu bi ton nhng cn ny cng thu hp dn theo tng bc , nu ta tm c s thay i ca cn theo tng bc th cc kh nng c ngy cng hp dn , bi ton nhanh chng kt thc . Tr li bi ton con m i tun nhng vi yu cu ch hin 1 nghim Cch 1 : ( Thng thng ) Uses Crt; Const Max = 7; Fi = 'madq.inp'; D : Array [1..8] of -2..2 = (-2,-2,-1,1,2,2,1,-1); C : Array [1..8] of -2..2 = (-1,1,2,2,1,-1,-2,-2); Var F : Text; T1,T2 : longint; A : Array[1..Max,1..Max] of Integer; x,y,Lx,Ly,k,dem,n,nsq : Integer; Procedure DocFi; Begin Assign(F,Fi); {$I-} Reset(F); {$I+} If Ioresult<>0 then Begin Writeln('Loi File '); Readln; Halt; End; Readln(F,N); Nsq := N*N; Readln(F,x,y); Lx := x; Ly := y; Close(F); End; Procedure Hien; Var i,j : Integer; Begin Inc(dem); Assign(F,Fi); Append(F); Writeln(F,'Nghiem thu ',dem); For i:=1 to N do Begin For j:=1 to N do Write(F,A[i,j]:3); Writeln(F); End;

Close(F); End; Procedure Try(k:Integer;x,y: Integer); Var i,j,u,v : Integer; Begin If k>nsq then Hien Else Begin If dem=1 then Begin Writeln('Da xong . Moi an phim Enter '); Readln; Halt; End; For i:=1 to 8 do Begin u:=x+D[i]; v:=y+C[i]; {Writeln(u,' ',v);} If (u in [1..n]) and (v in [1..n]) and (A[u,v]=0) then Begin A[u,v]:=k; try(k+1,u,v); A[u,v]:=0; End; End; If (u=Lx) and (v=Ly) then Begin Writeln('Vo nghiem '); Readln; Halt; End End; End; BEGIN Clrscr; Fillchar(A,Sizeof(A),0); dem:=0; DocFi; A[x,y]:=1; k:=1; Try(2,x,y); END. Cch 2 :{ t mt chn hng i nhanh chng ti ch l chn c bc thp nht } {Hiu sut chng trnh tng ng k - Li gii : Trng V Hng 12CT 1996} {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R+,S+,T-,V+,X+} {$M 16384,0,655360} Uses crt;

Const Max = 20; dx : Array[1..8] of integer=(-2,-1,1,2, 2, 1,-1,-2); dy : Array[1..8] of integer=( 1, 2, 2,1,-1,-2,-2,-1); Var N,x,y : Byte; A : Array[-1..max+2,-1..max+2] of Integer; Procedure Nhap; Begin Write('Nhap kich thuoc ban co = '); Readln(n); Write('Nhap toa do xuat phat x,y = '); Readln(x,y); End; Procedure Hien; Var i,j : Integer; Begin For i:=1 to n do Begin For j:=1 to n do write(a[i,j]:4); Writeln; End; End; Procedure Hangrao; Var i,j : Integer; Begin Fillchar(a,sizeof(a),0); For i:=-1 to n+2 do For j:=1 to 2 do Begin A[i,1-j]:=-1; A[i,n+j]:=-1; A[1-j,i]:=-1; A[n+j,i]:=-1; End; End; Function Bac(x,y:integer) : Integer; Var i,dem : Byte; Begin dem:=0; For i:=1 to 8 do If a[x+dx[i],y+dy[i]]=0 then inc(dem); Bac:=dem; End; Procedure Vet(so,i,j:integer); Var k,lk ,Ldem,p : Byte; Begin If so>n*n then Begin Clrscr; Hien;

Readln; Halt; End; Ldem:=9; For k:=1 to 8 do If A[i+dx[k],j+dy[k]]=0 then Begin P := Bac(i+dx[k],j+dy[k]); If {( P>=0 ) and} ( Ldem>P ) then Begin Lk := k; Ldem := p; End; End; If Ldem = 9 then exit; {Ldem =9: (i,j) tc nghn, nn Exit } {Ldem<9 : S chn c l c bc nh nht} A[i+dx[Lk],j+dy[Lk]] := So; Vet(so+1,i+dx[Lk],j+dy[Lk]); A[i+dx[Lk],j+dy[Lk]] := 0; End; Procedure Lam; Begin Hangrao; A[x,y]:=1; Vet(2,x,y); End; BEGIN Clrscr; Nhap; Lam; END. Li bnh : Ngoi vic s dng qui kt hp quay lui , chng trnh cn da trn thut ton Hu n : c li th lm nhanh chng t ch . C th l mi bc SO s chn ca bc (S0+1) tip theo nu t y c t hng i tip ti khcca bc (S0+2) .Cy phn nhnh s t nhnh i ng k . Tt nhin phi chng minh rng, vi cch thc i nh th vn bo m c t nht 1 nghim. Ta thy :Bng cch chn c bc thp v phi xut pht t (1,1) nn c i vng quanh bn c dn vo trong lun c ng i vo trong rut bn c , v bc cc bn ngoi ln hn bc cc bn trong, v bc cc bn trong cn ln hn 1 khi m cha vo su trongbn c .Ch khi gn kt thc mi ny sinh vn : c ng i tip na hay khng ( cn c bc ln hn 1 hay khng ) , ngha l khi ta mi bit cch i ny c ng n khng ? ( Cc em hy t chng minh , hoc t nht hy th nghim vi cc gi tr N=5,6,7,8,..20 nu vn c nghim th r rng cch i nh th ng vi cc trng hp ny ) v nh th kt qu thu c cng qu bt ng so vi lp trnh bnh thng Vy Hu n nhiu khi cng c li lm y . * Mt kh khn khc ca loi ton hin 1 nghim l : trng hp bi ton v nghim cn vit chng trnh nh th no ? Phi duyt ht mi kh nng mi

r kt lun v nghim hay khng v nghim . Ngha l i theo mi nhnh nhng nhnh no cng u khng ti ch ,do theo quy lut c quay lui mi tm kim th n lc no dn n tnh trng phi tr v xut pht Vy khi gp c mi trng vi xut pht th bi ton v nghim . (xem li bi gii trang 330) . Ta ch cn thm vo mu 1 (Dng tm mi nghim ) mt cht gia v l c ngay dng tng ng vi bi ton v nghim : Procedure Tim(k : Integer); Begin Vng lp c mi kh nng ca bc th k trong tm kim 1 nghim Begin + Th chn 1 c cho bc k + Nu c ny chp nhn c th Begin * Ghi nhn gi tr c; * Lu trng thi mi ca bi ton sau c; * Nu cha phi bc cui cng th Tim(K+1) Else {l bc cui cng} th Hin Nghim; * Tr li trng thi ca bi ton trc khi c; End; End; Nu c cui cng ra khi vng lp trng vi gi tr ca b c th nht th Begin Thng bo v nghim Thot End; End; Cng c th vit di dng sau : Procedure Tim(k : Integer); Begin Nu bc k l bc sau bc cui cng th Hin nghim ; Vng lp c mi kh nng ca bc th k trong tm kim 1 nghim Begin + Th chn 1 c cho bc k + Nu c ny tho mn bi ton th Begin * Ghi nhn gi tr c; * Lu trng thi mi ca bi ton sau c; * Tim(k+1); * Tr li trng thi ca bi ton trc khi c; End; End; Nu c cui cng ra khi vng lp trng vi gi tr ca bc th nht th Begin Thng bo v nghim Thot End;

End; Hoc c th x l bi ton v nghim nh chng trnh sau : Uses Crt; Const N =5; nsq=n*n; A : Array[1..8] of integer=(2,1,-1,-2,-2,-1,1,2); B : Array[1..8] of integer=(1,2,2,1,-1,-2,-2,-1); Type Index=1..n; Var i,j : Index; q : Boolean; h : Array[index,index] of integer; Procedure Try(i:integer;x,y:index;Var q:Boolean); Var k,u,v : Integer; q1 : Boolean; Begin k:=0; Repeat Inc(k); q1:=false; u :=x+a[k]; v :=y+b[k]; If (1<=u) and (u<=n) and (1<=v) and (v<=n) then If h[u,v]=0 then Begin h[u,v]:=i; If i< nsq then Begin Try(i+1,u,v,q1); If not q1 then h[u,v]:=0; End Else q1:=true; End Until q1 or (k=8); q:=q1; End; BEGIN Clrscr; q:=False; For i:=1 to n do For j:=1 to n do h[i,j]:=0; h[1,1]:=1; Try(2,1,1,q); If q then For i:=1 to n do Begin For j:=1 to n do Write(h[i,j]:5); Writeln; End Else Writeln(' Khng c nghim '); END.

Ngi lp trnh a thm vo th tc qui mt tham bin q vi chc nng lm nhim v thng bo tnh trng c nghim hay cha ? q ch nhn gi tr TRUE khi bc tip theo l bc cui cng . Do nu sau khi vt cn mi kh nng vn khng i ti bc cui cng , tham bin q sau khi thot khi th tc qui Try s c gi tr FALSE ban u . Vy sau th tc qui Try , nu q=TRUE th c nghim , nu q =FALSE l v nghim .Nhim v ca q nh ci gy d dm tm ng vy ! C th tng di ca gy ln khng, n thng bo kt thc sm hn khng ? ( Cc em hy chy chng trnh vi N=4 ).

Dng 3 : Tm nghim ti u C 3 cch thng dng : Cch 1 : Procedure Tim(k : Integer); Begin Nu bc k l bc sau bc cui cng th Begin Nu tm c nghim mi th So snh nghim mi vi nghim lu ti u trc chn li nghim lu ti u End; Vng lp c mi kh nng ca bc th k trong tm kim 1 nghim ( Ch nn kt hp vi nghim lu ti u c thu hp din c ) Begin + Th chn 1 c cho bc k + Nu c ny tho mn bi ton th Begin * Ghi nhn gi tr c; * Lu trng thi mi ca bi ton sau c; * Tim(k+1); * Tr li trng thi ca bi ton trc khi c; End; End; End;

Th d trong bi ton du lch : Tm ng i qua N thnh ph , mi thnh ph ch qua 1 ln , sao cho tn t chi ph vn chuyn nht . Mi nghim ca bi ton l 1 vc t N thnh phn l dy tn c th t chn ca N thnh ph . Gi s tm c 1 s nghim , v trong nghim tt nht c ch ph tng ng l CPMax ng , by gi tm tip cc nghim cn li .t tnh hung ta ang xy dng ti thnh phn th i (i<N) ca nghim tip theo ,gi CP2 l tng chi ph ti thiu ca N-i thnh ph cn li , CP1 l tng chi ph qua i thnh ph chn Nu mt c no ca bc i m CP1+CP2 > CPMax th c ny b loi . Nh vy bit kt hp vi nghim ti u ca cc nghim trc th vic tm kim nghim tip theo c nhanh chng hn .

Cch 2 : Procedure Tim(k : Integer); Begin Vng lp c mi kh nng ca bc th k trong tm kim 1 nghim ( Ch nn kt hp vi nghim l u ti u c thu hp din c ) Begin + Th chn 1 c cho bc k + Nu c ny chp nhn c th Begin * Ghi nhn gi tr c; * Lu trng thi mi ca bi ton sau c; * Nu cha phi bc cui cng th Tim(K+1) Else {l bc cui cng} th Begin So snh nghim mi vi nghim ti u trc chn li nghim ti u End; * Tr li trng thi ca bi ton trc khi c End; End; End; Cch 3 : Thng dng trong cc bi ton chn mt s phn t trong N phn t cho trc to thnh 1 nghim .Th tc di y thc hin th chn dn phn t i cho nghim tt nht , S : iu kin chp nhn ca cc phn t i s chn , F l cn trn ca hm mc tiu cn ti u ( Xem li gii bi ton ci ti Trang 343 )

Procedure Tim( i : Integer; S ,F: LongInt) Begin * Nu phn t i tho mn i kin chp nhn S th Begin + Ghi phn t th i vo tp nghim + Nu i cha phi phn t cui cng then Tim(i+1,S _mi ,F) Cn khng : Nu cn trn cn ln hn so vi Lu cn l LF th Begin LF := F; LuNghim := Nghim ; End; + Tr li trng thi c : Loi b phn t i khi tp nghim . End; * Gim Cn trn ca hm mc tiu : chn cn mi l F_mi * Nu F_Mi > LF th Begin Nu i cha l phn t cui cng th Tim(i+1,S,F_Mi) Cn khng : Begin LuF := F_Mi; Lunghim := Nghim; End; End; End; Bi ton 1: Bi ton ngi du lch : Cho N thnh ph , gi cc ph vn chuyn t thnh ph i ti thnh ph j l C ij . Yu cu : File d liu vo l DULICH.INP nh sau Dng u l N , XP , Dich ( N s thnh ph , XP : th/ ph xut pht , Dich : th/ph ch ) N dng tip theo : S u dng l i , cc cp s tip theo l j v C ij ca ma trn C(N,N) File d liu ra l DULICH.OUT Dng u : Lit k hnh trnh tn t chi ph nht , ln lt qua N thnh ph ( Mi thnh ph ch 1 ln ) Dng tip theo : Tng chi ph . TEST : DULICH.INP 10 1 8 1 2 3 5 2 7 3 9 3 10 7 2 5 1 6 6 10 3 3 1 7 8 1 10 7 4 1 3 2 2 5 3 9 7 5 1 2 3 7 4 5 6 1 7 8 8 2 9 3 6 1 8 2 7 3 5 7 6 8 1 10 8 7 1 1 3 3 5 2 6 5 8 6 10 1 8 2 2 3 7 6 4 9 2 9 2 5 6 1 10 2 1 4 6 5 2 7 3 8 6 DULICH.OUT 1 5 8 6 Bi cha : Bi ton du lch

Uses Const

Crt; MN = 100; TF1 = 'DULICH.INP'; TF2 = 'DULICH.OUT'; Var F : Text; C : Array[1..MN,1..MN] of Integer; KQ,LKQ : Array[1..MN] of Byte; D : Array[1..MN] of Boolean; N,Lcs,cs,xp,Dich : Byte; Tong,LTong : LongInt; Procedure Batdau; Begin FillChar(C,Sizeof(C),0); FillChar(D,Sizeof(D),False); FillChar(KQ,Sizeof(KQ),0); FillChar(LKQ,Sizeof(LKQ),0); End; Procedure TaoF; Var F : Text; i,j,k : Byte; Begin Write('Nhap so thanh pho : ');Readln(N); Write('Nhap thanh pho xuat phat : ');Readln(xp); Write('Nhap thanh pho se toi : ');Readln(Dich); Assign(F,TF1); ReWrite(F); Writeln(F,N,' ',Xp,' ',Dich); Randomize; For i:=1 to N do Begin Write(F,i:4); For j:=1 to N do Begin k := Random(2); If i=j then k:=0; If k=1 then Write(F,j:4,(Random(8)+1):2); End; Writeln(F); End; Close(F); End; Procedure DocF; Var i,j : Byte; F : Text; Begin Assign(F,TF1); Reset(F); Readln(F,N,XP,Dich); While Not SeekEof(F) do Begin

Read(F,i); While Not Eoln(F) do Begin Read(F,j); Read(F,C[i,j]); End; End; Close(F); Tong := 0; LTong:= MaxInt div 2; cs := 1; KQ[cs] := xp; D[xp] := True; End; Procedure Hien; Var i,j : Byte; Begin For i:=1 to n do Begin For j:=1 to N do If C[i,j]>0 then Write(C[i,j]:2) Else Write('*':2); Writeln; End; End; Procedure Tim (i: Byte;Tong : LongInt); Var j : Byte; Begin For j:=1 to N do If (Not D[j]) and (i<>j) then If (C[i,j]>0) and (Ltong-Tong>=C[i,j]) then Begin Inc(cs); KQ[cs] := j; D[j] := True; Tong := Tong + C[i,j]; If (j<>dich) then Tim(j,Tong) Else If (Tong<Ltong) or ((Tong=Ltong) and (cs<Lcs)) then Begin Ltong := Tong; LKQ := KQ; Lcs := cs; End; Dec(cs); D[j] := False; Tong := Tong - C[i,j]; End; End; Procedure HienKQ;

Var i : Byte; Begin For i:=1 to Lcs do Write(LKQ[i]:4); Writeln; Writeln('Tong chi phi la : ',LTong); End; BEGIN Clrscr; {TaoF;} Batdau; DocF; Nhonhat := Min; If XP= Dich then Begin Writeln(Xp); Writeln(Khong di chuyen );Readln;Halt;End; Tim(xp,Tong); {Hien;Chi goi khi N<=10} Writeln; HienKq; Readln; END. Bi ton 2 ( Bi ton ci ti ) : Tm cch chn cc vt trong N vt (mi loi vt ch chn 1), xp vo va li sao cho tng gi tr ca cc vt trong va ly l ln nht nhng tng trng lng ca chng khng vt qu gii hn qui nh l LimW. Gi s N, Wi , Vi u nguyn dng ( Wi : trng lng vt i , Vi : gi tr vt i ) D liu vo : cho trong File VALY.INP t chc nh sau Dng u : 2 s N LimW N dng tip theo : Mi dng 2 s Wi Vi D liu ra : File VALY.OUT Dng u : s LimW Cc dng tip theo : Mi dng 3 s : i Wi Vi l s th t ,trng lng,gi tr ca cc vt c chn vo va ly. Bi gii Uses Crt; Const MN = 30; TF = 'Valy.inp'; TF2 = 'Valy.out'; Type Index = 1..MN; Dovat = Record W,V : Integer; { W Trong luong ,V Gia tri } End; Var i,N : Index; A : Array[Index] of Dovat; KQ,LKQ : Set of Index; LimW,LCanV,CanV : Integer; Procedure DocF; Var i : Index; F : Text;

Begin Assign(F,TF); Reset(F); Readln(F,N,LimW); For i:=1 to N do With A[i] do Begin Readln(F,W,V); CanV := CanV+V; End; Close(F); End; Procedure Try(i : Index;Tw,CanV : Integer); Var CanV1 : Integer; Begin If Tw + A[i].w <= LimW then Begin KQ := KQ+[i]; If i<N then Try(i+1,Tw+ A[i].w,Canv) Else If CanV > LCanV then Begin LCanV := Canv; LKQ := KQ; End; KQ := KQ-[i]; End; CanV1:= CanV - A[i].v; If CanV1>LCanV then Begin If i<N then Try(i+1,Tw,CanV1) Else Begin LCanV := CanV1; LKQ := KQ; End; End; End; Procedure GhiF; Var i : Index; F : Text; Begin Assign(F,TF2); ReWrite(F); Writeln(F,'Gioi han trong luong : ',LimW); For i:=1 to N do If i in LKQ then With A[i] do Writeln(F,i:4,' : TrLG = ',W:4,', GT = ',V:4); Close(F); End; BEGIN

DocF; LCanV := 0; Try(1,0,CanV); GhiF; Writeln('Da xong '); Readln; END.

You might also like