You are on page 1of 5

Thut ton qui hoch ng

Trong qu trnh hc tp, chng ta gp rt nhiu cc bi tp v Ton-Tin. Cc bi tp dng ny rt phong ph v a dng. Thc t cha c thut ton hon chnh c th p dng cho mi bi ton. Tuy nhin ngi ta tm ra mt s thut ton chung nh chia tr, tham n, quay lui,... Cc thut ton ny c th p dng gii mt lp kh rng cc bi ton hay gp trong thc t. Trong bi vit ny, ti mun cp vi cc bn mt thut ton khc, l thut ton quy hoch ng. T tng c bn ca thut ton l: gii mt bi ton ta chia bi ton thnh cc bi ton nh hn c th gii mt cch d dng. Sau kt hp li gii cc bi ton con, ta c c li gii bi ton ban u. Trong qu trnh gii cc bi ton con i khi ta gp rt nhiu kt qu trng lp ca cc bi ton con. tng tnh hiu qu, thay v phi tnh li cc kt qu , ta lu chng vo mt bng. Khi cn li gii ca mt bi ton con no ta ch cn tim trong bng, khng cn tnh li. T tng ca thut ton quy hoch ng kh n gin. Tuy nhin khi p dng thut ton vo trng hp c th li khng d dng (iu ny cng tng t nh nguyn tc Dirichlet trong ton vy). Khi gii bi ton bng phng php ny, chng ta phi thc hin hai yu cu quan trng sau: - Tm cng thc truy hi xc nh nghim bi ton qua nghim cc bi ton con nh hn. - Vi mi bi ton c th, ta ra phng n lu tr nghim mt cch hp l t c th truy cp mt cch thun tin nht. minh ho thut ton, ta xt mt vi v d. V d 1: Cho hai dy s nguyn (a1,a2,...,am), (b1,b2,...,bn). Tm dy con chung c di ln nht ca hai dy trn (coi dy khng c s nguyn no l dy con ca mi dy v c di bng 0). Li gii Chng ta c th thy ngay rng phc tp ca bi ton trn ph thuc vo hai s m, n. Xt hai trng hp: +Trng hp1:; m=0 hoc n=0. y l trng hp c bit, c duy nht mt dy con chung ca hai dy c di bng 0. V vy dy con chung c di ln nht ca chng c di bng 0. +Trng hp 2: m# 0 v n # 0. Trong trng hp ny, ta xt cc bi ton nh hn l tm dy con chung c di ln nht ca hai dy (a1,a2,...,ai), (b1,b2,...,bj) vi 0 <= i <= m, 0 <= j <= n. Gi [i,j] l di ca dy con chung ln nht ca hai dy (a 1,...,ai),

(b1,...,bj). ; Nh vy ta phi tnh tt c cc l[i,j] trong 0<=i<=m, 0<=j<=n. Chng ta c th thy ngay rng l[0,0]=0. Gi s ta tnh c l[s,t] vi 1 - Nu ii # bj th l[i,j]=max{l[i-1,j], l[i,j-1]}. - Nu ii=bj th l[i,j]= 1+l[i-1,j-1]. Vi nhng nhn xt trn, ta hon ton tnh c l[m,n] chnh l di dy con chung di nht ca (a1,..am), (b1,..bn). tm phn t ca dy con, ta xut pht t l[m,n] ti l[0,0]. Gi s ta ang l[i,j]. Nu ai=bj th ta thm ai vo dy con ri nhy ti l[i-1,j-1]. Nu aibj th l[i,j]=l[i-1,j] hoc l[i,j]=l[i,j-1]. Nu l[i,j]=l[i-1,j] th nhy ti l[i1,j], ngc li th nhy ti l[i,j-1]. Sau y l li gii ca bi ton. Chng trnh c vit bng ngn ng Pascal: uses crt; const fi='b2.inp'; var a:array[1..10] of integer; b:array[1..10] of integer; kq:array[0..10,0..10] of integer; i,j,maxa,maxb:integer; f:text; procedure init; begin assign(f,fi); reset(f); i:=0; while not(eoln(f)) do begin inc(i); read(f,a[i]); end; maxa:=i; readln(f); i:=0; while not(eoln(f)) do begin inc(i); read(f,b[i]); end; maxb:=i; close(f); end;

function max(a,b:integer):integer; begin if a>b then max:=a else max:=b; end; begin init; kq[0,0]:=0; for i:=1 to maxa do for j:=1 to maxb do if a[i]<>b[j] then kq[i,j]:=max(kq[i-1,j],kq[i,j-1]) else kq[i,j]:=kq[i-1,j-1]+1; writeln('Do dai day con chung lon nhat:',kq[maxa,maxb]); i:=maxa; j:=maxb; while (i>0)or(j>0) do if a[i]=b[j] then begin write(a[i]); dec(i); dec(j); end else if kq[i-1,j]=kq[i,j] then dec(i) else dec(j); end. Vi ni dung file b2.inp cha 2 dy (a1,a2,..am) ,(b1,b2,..bn) sau: 1232346 6987 Xt bi ton kinh in v ti u t hp: V d 2: Cho ci ti cha c trng lng ti a l w. C n vt, vt th i c khi lng a[i] v gi tr c[i], 1<= i <=n. Tm cch xp vt vo ti sao cho t gi tr ln nht. Li gii Gi f(k,v) l gi tr ln nht ca ti ng trng lng v v ch cha cc vt t 1 n k. Nu k=1 th f(k,v)=(v div a[1])*c[1]. Gi s tnh c f(s,t) vi 1<S< ti?nh Ca^`n 1<t t: tg=v div a[k], f(k,v)=max{f(k-1,u)+x*c[k]} (*) ,vi x=0,1,2,...,tg, u=v-x*a[k]

Gi tr ln nht l f(n,w). Ta dng mng bn ghi a[1..n,1..w] cha kt qu trung gian. Mi bn ghi a[k,v] cha gi tr f(k,v) v gi tr x tho mn cng thc (*). xc nh s lng x[i] vt i tho mn iu kin ti u, ta xut pht t a[n,w] xc nh c x[n]. Nhy ti a[n-1,w-x[n]*a[n]] xc nh c x[n-1]. C nh vy ti x[1]. uses crt; const n=5; w=17; fi='b3.inp'; type kq=record num,val:integer; end; var a:array[1..10] of integer; {khoi luong} c:array[1..10] of integer; {Gia tri} i,j,tg,k,max,save:integer; f:text; b:array[1..n,1..w] of kq; procedure init; begin assign(f,fi); reset(f); for i:=1 to n do begin read(f,a[i],c[i]); end; close(f); end; begin init; for j:=1 to w do for i:=1 to n do begin tg:=j div a[i]; max:=0; for k:=0 to tg do if (b[i-1,j-k*a[i]].val+k*c[i])>max then begin max:=b[i-1,j-k*a[i]].val+k*c[i]; save:=k; end; b[i,j].val:=max; b[i,j].num:=save; end;

for i:=1 to n do begin for j:=1 to w do write(b[i,j].val:3); writeln; end; writeln('Max:',b[n,w].val); i:=n; j:=w; while i>=1 do begin if b[i,j].num>0 then writeln('Co ',b[i,j].num,' do vat ',i); j:=j-a[i]*b[i,j].num; dec(i); end; readln; end. Vi ni dung file b3.inp :hng i cha khi lng a[i], gi tr c[i]: 34 45 7 10 8 11 9 13 Qua hai v d trn chc cc bn nm c t tng ca thut ton qui hoch ng cng nh cch ci t cho n. Nh cc bn thy, cch pht biu thut ton rt n gin. Nu bit cch vn dng thut ton mt cch hp l, ta c th gii c mt lp kh rng cc bi ton trong thc t. Hi vng thut ton s l cng c tt ca cc bn trong qu trnh hc tp mn tin hc.

You might also like