CƠ SỞ LẬP TRÌNH

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 55

Mt s vn c s ca Tin hc

Cu trc d liu v thut gii


Gio vin: T Thc Nhu Khoa CNTT trng H Lc Hng

QUI RECURVE
2

Khi nim Qui

Mt khi nim X c nh ngha theo kiu qui nu trong nh ngha ca X c s dng trc tip hoc gin tip li chnh khi nim X.

V d
1. nh nghi giai tha ca mt s t nhin N, k hiu N!
a) N! = 1 nu N = 0 b) N! = N*(N-1)! nu N > 0

2. nh nghi UCLN ca 2 s M v N, k hiu: UCLN(M, N)


a) UCLN(M, N) = M nu N = 0 b) UCLN(M, N) = UCLN(N, phn d ca M/N) nu N<>0

3. Dy s Fibonacci c nh ngha nh sau: a) F(0) = F(1)= 1 b) F(n) =F(n - 2) + F(n - 1) vi n>=2.

Mt nh nghi qui phi c 2 thnh phn:


Thnh phn dng: Khng cha khi nim ang nh nghi
V d: N! = 1 nu N = 0

Thnh phn qui: c cha khi nim ang nh nghi

nh nghi giai tha ca mt s t nhin N, k hiu N! 1. N! = 1 nu N = 0 2. N! = N * (N - 1)! nu N > 0

Chng trnh qui


Mt chng trnh l qui nu trong chng trnh c li gi thc hin li chnh n.

V d: nh ngha hm tnh N! theo qui. int Fac(int N) { if (N == 0) return 1; return N * Fac(N - 1); }

V d: Tnh UCLN(M, N) theo thut ton Euclide a) UCLN(M, N) = M nu N = 0 b) UCLN(M, N) = UCLN(N, M mod N) nu N>0 int UCLN(int M, int N) { if (N == 0) return M; return UCLN(N, M % N); }

Mt s dng qui thng gp


1- qui tuyn tnh. Hm F {
Nu (tha iu kin dng) th <thc hin S> Ngc li <gi qui hm F>

} Vi S l thao tc khng qui .

2- qui nh phn Hm F { Nu (tha iu kin dng) th <thc hin S> Ngc li { gi hm F ; gi hm F } } Vi S l thao tc khng qui V d: Hm tm gi tr phn t F(n) ca dy Fibonacci int F(int n) { if ( n < 2 ) return 1 ; return F(n -1) + F(n -2) ; }
9

10

3- qui phi tuyn:


Li gi qui c thc hin bn trong vng lp

Hm F() { for (gi tri u ti gi tr cui) { Nu (tha iu kin dng) th <thc hin S> Ngc li < gi qui F > } }
11

THUT GII QUAY LUI BACK TRACKING

12

Cng dng:
Gii bi ton lit k tt c cc li gii tha yu cu bi ton. V d: 1. Lit k cc dy nh phn c di N 2. Lit k cc tp con k phn t ca tp S = {1, 2,.., n} 3. Lit k cc chnh hp khng lp chp k ca tp S = {1, 2,.., n}

13

Tng quan thut gii Quay lui (BackTracking)


Cu trc li gii l mt tp hp c N phn t cng kiu Vic xc nh gi tr tng phn t da trn tp gi tr c. tm mt li gii khc, ta quay lui chn gi tr khc cho mi phn t.

Cu hnh mt li gii

X1

X2

X3

Xn

Tp gi tr c

v1

v2

vm

14

Thut gii 1: Xc nh gi tr phn t i ca li gii


void Try( int i ) { for ( mi v thuc tp gi tr c cho Xi ) { Xi = v ; if ( Xi l phn t cui cng) < Thng bo li gii tm c>; else Try( i+1); //Gi qui xc nh phn t X[ i+1 ] } }
15

Bi ton: Lit k cc dy nh phn c di n Phn tch: Cu trc li gii l dy c n phn t: X[1] .. X[n] Mi phn t X[ i ] nhn gi tr trong tp c {0, 1}

Cu trc li gii

Tp gi tr c

16

Xc nh gi tr phn t X[i] ca dy nh phn void XacDinhPhanTu(int i) { for (int v = 0; v<= 1; v++) { X[ i ] = v; if ( i == n ) <Xut dy nh phn tm c>; else XacDinhPhanTu ( i + 1 ); } }

17

Bi ton: Lit k cc tp con c K phn t ca tp S = {1, 2, .., n} (K <= n)


Cu trc li gii l dy c K phn t: X[1] .. X[K] X[i] nhn gi tr trong tp S = { 1, 2, .., n } Yu cu li gii:
Gi tr cc phn t trong mt li gii phi phn bit. X[ i ] <> X[ j ] vi i <> j Khng xt th t phn t trong tp hp {1, 2, 3} = {2, 1, 3}

18

Cch gii:
a ra iu kin cho mi tp con l : 1 <= X[1] < X[2] < .. < X[ i ] < .. < X[K-1] < X[K] <= N Nhn xt:
X[K] <= N X[K-1] <= X[K] - 1 <= N 1 X[K-2] <= X[K] - 2 <= N 2 X[ i ] = X[K-(K-i)] <= N - (K - i)

Gii hn gi tr c cho thnh phn X[i] trong khong t : X[i-1]+1 n (N K + i) iu ny cng ng cho c trng hp i = 1, ta thm vo X[0] = 0.
19

Xc nh gi tr phn t Xi ca mt tp con
void XacDinhPhanTu(int i) { for (int v = X[i-1]+1; v <= N-K+i; v++) { X[i] = v; if ( i == K ) <Thng bo tp con tm c>; else XacDinhPhanTu( i + 1 ); } }
20

Thut gii 2: Xc nh gi tr cho phn t i vi gi tr c c iu kin


void Try( int i ) { for ( mi v thuc tp gi tr c cho Xi) if ( Chp nhn v ) { Xi = v; If ( Xi l phn t cui cng ) < Thng bo li gii tm c>; else { Ghi nhn gi tr v c chn; Try( i + 1); //Gi qui xc nh phn t Xi+1 B ghi nhn gi tr v chn; (nu cn) } } }
21

Bi ton: Lit k cc chnh hp khng lp chp k ca tp S={1, 2,.., n}


Cu trc li gii l mt dy k phn t: X[1], .., X[k] X[i] nhn gi tr trong tp S = { 1, 2, .., n } Yu cu li gii: Gi tr cc phn t trong mt li gii phi phn bit. X[ i ] <> X[ j ] vi i <> j C tnh n th t phn t trong chnh hp: Chnh hp {1, 2, 3} <> chnh hp {2, 1, 3} Hng gii quyt chung: t chc cc bin trng thi phc v cho vic kim tra gi tr c: Dng mng F[1..n] ghi nh tnh trng chn ca tng gi tr trong tp S={1, 2, .., n}, vi qui c: F[ v ] = 0 nu v cha chn F[ v ] = 1 nu v chn
22

Thut gii xc nh phn t Xi ca mt chnh hp khng lp chp k ca tp S={1, 2,.., n}


void Try(int i) { for (int v = 1; v<= n; v++) if (F[v] == 0) { X[i] = v; if ( i == k ) <Thng bo li gii tm c>; else { F[v] = 1;
Try( i + 1 );

F[v] = 0; } } }
23

Bi ton M i tun: ch ra hnh trnh ca qun M xut pht t mt trn bn c i qua tt c cc cn li ca bn c, mi ng 1 ln.
Phn tch: Cu trc li gii l BC[1..n][1..n] cha s th t hnh trnh ca qun M. Tp gi tr c cha cc gi tr dng tnh ta cc k tip dx[1..8] = {-2,-1, 1, 2, 2, 1, -1, -2} dy[1..8] = { 1, 2, 2, 1, -1, -2, -2, -1} iu kin chn gi tr c cho bc i th i phi n mt : Thuc bn c V cha i qua: BC[u, v] = 00

(u, v)

(x, y)

24

Thut gii xc nh bc i th i ca qun M


void Try(int i) { int j,u,v; for ( j = 1; j <= 8 ; j++) { u =x + dx[ j ] ; v = y + dy[ j ]; if (u >= 1 && u <= n && v >= 1 && v<=n && BC[u,v] = 0) { BC[u, v] = i; if (i == n*n) <Thng bo li gii tm c>; else { x = u; y = v; Try(i+1); x = u - dx[ j ]; y = v - dy[ j ]; BC[u, v] = 0; } } } }
25

Bi ton: t 8 Qun Hu trn bn c quc t 8x8 sao cho cc qun Hu khng n nhau
Phn tch: Cu trc li gii l mng Dong[1..8] lu ch s ca ct c cha qun hu Tp gi tr c {1..8 } l ch s ca ct s t qun hu. T chc cc bin trng thi ghi nhn ng cho no c qun hu: ng cho ngc: CN[1..15] (d, c) thuc ng CN[c + d - 1] ng cho xui: CX[1..15] (d, c) thuc ng CX[ 8 + c d ] T chc bin trng thi ghi nhn ct c qun hu: Cot[1..8]
1 2 3
26

Thut gii xc nh ct t qun hu trn dng d


void DienDong(int d) { for (int c = 1; c <= 8; c++) If (Cot[c] = 0 && CN[c + d -1]=0 && CX[8+c-d] = 0) { Dong[d] = c ; if (d==8) <Thng bo li gii tm c>; else { Cot[ c ] = CN[c + d -1] = CX[8+c-d] = 1; DienDong(d+1); Cot[ c ] = CN[c + d -1] = CX[8+c-d] = 0; } } }
27

Vn dng thut ton quay lui gii cc bi ton cc tr

2 1 3 1 1 2 4 2 4 3

28

Bi ton ngi du lch


C n thnh ph (c nh s t 1 n n), chi ph i t thnh ph i n thnh ph v l C[i, v]. Mt ngi i du lch xut pht t mt thnh ph mun i thm cc thnh ph khc, mi thnh ph ng mt ln ri quay v ni xut pht. Hy tm 1 hnh trnh cho ngi du lch tng chi ph theo hnh trnh ny l t nht.

2 1 3 1 1 2 4 2 4 3

0 3 2 1

3 0 1 2

2 1 0 4

1 2 4 0

Ma trn chi ph C
29

Phn tch:
Mi hnh trnh l mt chu trnh i qua cc thnh ph {1, 2, .., n}. Cu trc li gii l dy X[1..n] trong : X[1] = 1 c xem l thnh ph xut pht. X[2..n] cha hon v ca dy {2, 3, .. ,n}

n 1 S = C[X i , X i + 1 ] + C[X n , X1 ] Tng chi ph ca mt hnh trnh bng: i =1


2 1 3 1 1 2 4 2 4 3

0 3 2 1

3 0 1 2

2 1 0 4

1 2 4 0

Ma trn chi ph C
30

Thut gii xc nh phn t Xi


void Try(int i) { for (int v = 2; v <= n; v++) if (F[ v ] == 0) { X[ i ] = v; if ( i == n ) <Cp nht hnh trnh ti u>; else { F[ v ] = 1; Try( i + 1 ); F[ v ] = 0; } } }
31

Cp nht hnh trnh ti u:


T chc ghi nhn hnh trnh tt nht: Best[1..n] : cha hnh trnh c chi ph thp nht. Smin l tng chi ph thp nht ca hnh trnh Best. Khi to ban u cho Smin = Cmax * (n + 1), trong Cmax l chi ph ln nht trong cc chi ph C[i, j] cho Thut ton:

n 1 S = C[X i , X i + 1 ] + C[X n , X1 ] Tnh i =1

if ( S < Smin ) { Smin = S; Ghi nhn X l hnh trnh tt nht: Best = X; }

32

Bi ton Knapsack
C N vt, vt th i c trng lng l Ai v c gi tr l Ci (i=1,..,n). Xc nh cc vt cn b vo ba l sao cho tng trng lng khng qu M nhng c tng gi tr l ln nht.

33

Phn tch:
Vt c chn c c hiu l 1, vt khng c chn c c hiu l 0. a v bi ton lit k dy s nh phn Cu trc li gii l dy: X[1..n] X[i] = 1 : nu vt i c chn. X[i] = 0 : nu vt i khng c chn.

34

Xc nh gi tr phn t X[i] ca dy nh phn void Try(int i) { for (int v =0; v<= 1; v++) { X[ i ] = v; if ( i == n ) <Cp nht vt chn ti u>; else Try( i + 1 ); } }
35

Cp nht vt chn ti u:
T chc ghi nhn danh sch vt chn tt nht: Best[1..n] : cha dy nh phn ghi nhn cch chn ti u. Smax : tng gi tr ca cc vt trong cch chn ti u. Khi to ban u cho Smax = 0 S : tng gi tr ca cc vt trong cch chn hin hnh
n 1 S = X[i] * C[i ] i =1

W : Tng trng lng ca cc vt trong cch chn hin hnh


n 1 W = X[i] * A[i ] i=1

36

Cp nht vt chn ti u
Thut ton: Cp nht vt chn ti u
{

Tnh v

n 1 S = X[i] * C[i ] i =1 n 1 W = X[i] * A[i ] i=1

if ( W <= M && S > Smax ) { Smax = S; Ghi nhn X l la chn tt nht: Best = X; } }
37

K THUT NHNH CN

38

Cng dng
Gim thi gian thc hin bi ton tm li gii tt nht trong cc li gii c lit k bng thut ton quay lui. tng: Thm vo thut ton quay lui kh nng nh gi li gii ti u tng bc xc nh phn t Xi. Nu ti bc th i nh gi c li gii s khng ti u th quay lui ngay khng cn phi tm tip cc phn t khc.

39

M hnh nh gi nhnh cn trong thut ton quay lui:


void Try( int i ) { for ( mi v thuc tp kh nng c cho Xi) if ( Chp nhn v ) { Chn v cho Xi; If (Xi l phn t cui cng) <Cp nht li gii ti u>; else { Ghi nhn v chn cho Xi ; if (cn hy vng tm ra li gii ti u) Try( i+1); B ghi nhn v chn cho Xi; } } }
40

Bi ton ngi du lch


C n thnh ph (c nh s t 1 n n), chi ph i t thnh ph i n thnh ph v l C[i, v]. Mt ngi i du lch xut pht t mt thnh ph mun i thm cc thnh ph khc, mi thnh ph ng mt ln ri quay v ni xut pht. Hy tm 1 hnh trnh cho ngi du lch tng chi ph theo hnh trnh ny l t nht.

2 1 3 1 1 2 4 2 4 3

0 3 2 1

3 0 1 2

2 1 0 4

1 2 4 0

Ma trn chi ph C
41

Phn tch:
Cu trc li gii l dy: X[1..n]
X[1] = 1 c xem l thnh ph xut pht. X[2..n] l mt hon v ca cc thnh ph 2, .. ,n.

T chc ghi nhn li gii ti u:


Best[1..n] : cha hnh trnh c chi ph thp nht. Smin l tng chi ph thp nht ca hnh trnh Best tm c. Khi to ban u cho Smin = Cmax * n trong Cmax l chi ph ln nht trong cc chi ph C[i, v] cho

42

Thut gii xc nh phn t Xi


void Try(int i) { for (int v = 2; v <= n; v++) if (F[ v ] == 0) { X[ i ] = v; if ( i == n ) <Cp nht hnh trnh ti u>; else { F[ v ] = 1; if (cn hy vng tm ra li gii ti u) Try( i + 1 ); F[ v ] = 0; } } }
43

T chc nh gi li gii ti bc th i:
Thm mng T[1..n]: T[i] cha tng chi ph t X[1] n X[i] T[i] = T[i -1] + C[X[i -1], X[i]];
Khi to: T[1] = 0

nh gi li gii sau khi xc nh X[i]:


Gi Cmin l chi ph thp nht trong cc chi ph C[i, v].

Nu i tip (n i) thnh ph na th chi ph ti thiu phi l: T[i] + (n - i)*Cmin. Nu T[i] + (n - i)*Cmin < Smin th c hy vng tm c li gii ti u, ngc li th chc chn khng tm c li gii ti u.

44

Thut gii xc nh phn t Xi


void Try(int i) { for (int v = 2; v <= n; v++) if (F[ v ] == 0) { X[ i ] = v; T[ i ] = T[i -1] + C[X[i -1], v]; if ( i == n ) <Cp nht hnh trnh ti u>; else { F[ v ] = 1; if (T[ i ] + (n-i)*Cmin < Smin) Try( i + 1 ); F[ v ] = 0; } } }
45

Cp nht hnh trnh ti u:


Thut ton: { S = T[n] + C[X[n] , 1]; if (S < Smin ) { Smin = S; Ghi nhn X l hnh trnh tt nht: Best = X; } }

46

Bi ton Knapsack
C N vt, vt th i c trng lng l Ai v c gi tr l Ci (i=1,..,n). Xc nh cc vt cn b vo ba l sao cho tng trng lng khng qu M nhng c tng gi tr l ln nht.

47

Phn tch:
Cu trc li gii l dy: X[1..n]
X[i] = 1 : nu vt i c chn. X[i] = 0 : nu vt i khng c chn.

T chc ghi nhn li gii ti u:


Best[1..n] : cha dy nh phn cho kt qu ti u. Smax l tng gi tr ln nht ca cc vt chn. Khi to ban u cho Smax = 0

48

Xc nh gi tr phn t X[i] ca dy nh phn void Try(int i) { for (int v =0; v<= 1; v++) { X[ i ] = v; if ( i == n ) <Cp nht vt chn ti u>; else if (cn hy vng tm ra li gii ti u) Try( i + 1 ); } }

49

T chc nh gi li gii ti bc th i:
Mng T[0..n]: T[i] cha tng gi tr vt chn trong min [1..i] T[i] = T[i-1] + X[i]*C[i] Mng K[0..n]: K[i] cha tng khi lng cc vt chn trong min [1..i] K[i] = K[i-1] + X[i]*A[i] nh gi li gii sau khi xc nh X[i]:
Gi Cmax l gi tr ln nht trong cc gi tr C[i]. Nu chn ht (n i) vt cn li th tng gi tr ti a ca li gii l:

T[i] + (n-i)*Cmax Nu K[i] <= M v T[i] + (n-i)*Cmax > Smax: th c hy vng tm c li gii ti u.
50

Xc nh gi tr phn t X[i] ca dy nh phn


void Try(int i) { for (int v =0; v<= 1; v++) { X[ i ] = v; T[i] = T[i-1] + X[i]*C[i] K[i] = K[i-1] + X[i]*A[i] if ( i == n ) <Cp nht vt chn ti u>; else if (K[i] <= M && T[i] + (n-i)*Cmax > Smax) Try( i + 1 ); } }

51

Cp nht vt chn ti u:
Thut ton: { if ( K[n] <= M && T[n] > Smax ) { Smax = T[n]; Ghi nhn X l la chn tt nht: Best = X; } }

52

Mt s bi ton
1. C N gi ko, gi th i c Ai cc ko. Xy dng thut ton chia N gi ko thnh hai phn sao cho chnh lch s ko gia hai phn l t nht. Yu cu, khng c thay i s ko trong mi gi ; in chnh lch nh nht gia hai phn c th c v in danh sch gi ko ca tng nhm. 2. Cho 1 mng gm n cc s nguyn a[1], a[2],.., a[n] v mt s nguyn S. Hy tm tt c cc dy con : 1 <= x1 < x2 < .. < xk <= n sao cho: a[x1] + a[x2] + ..+ a[xk] = S 3. Mt dy chuyn sn xut c N (N<=100) v tr. C N cng nhn, cho bit nng sut ca cng nhn th i m lm v tr th j l Cij (Cij : Integer). Hy sp xp N cng nhn vo N v tr sao cho t nng sut cao nht. 4. Tnh s cch v in tt c cc cch phn tch s t nhin N >1 thnh tng cc s t nhin nh hn n (mi phn tch ch k ng mt ln: 4+3+1 v 1+4+3 ch l mt) 5. Hy tm tp hp cc du '+, - v khng du gia dy s 123456789 sao cho c mt biu thc c gi tr bng = N cho trc. V d: N = 280 ta c cc t hp sau: 1+2+345-67+8-9; 1+234-5+67-8-9; 123-4+5+67+89
53

6. Cho mt dy N s nguyn. Hy loi b khi dy mt s phn t c mt dy con, c t nht 2 phn t, khng gim v di nht. In ra dy con . V d: N = 10: 2 6 -7 5 8 1 -3 5 15 9 Kt qu tm c dy con khng gim di nht c 4 phn t: -7 -3 5 9 7. Mt ngi cha mang theo s tin l M vo mt ca hng mua K mn qu tng cho cc con. Trong ca hng c N mt hng, mt hng th i c gi tin l Ai. Ngi cha cn chn K (K < N) mt hng khc nhau lm qu sao cho tng s tin ca K mt hng ny l ln nht nhng khng ln hn s tin mang theo. 8. Mi ht x ngu c 6 mt, mi mt cha t 1 n 6 du chm. Lit k cc kt qu phn bit c th c khi cng lc 3 ht x ngu, khng k th t xut hin trn cc ht x ngu, v d {1, 2, 3} v {2, 3, 1} l nh nhau.

54

9. Trn bn c vung 4x4 xp 8 qun c gm 4 qun mu en v 4 qun mu trng sao cho trn mi hng v mi ct c ng mt qun mu en v 1 qun mu trng. Th hin trn mn hnh cc cch sp xp ny 10. Mt c s sn xut cn phn cng M nhn vin tham gia thc hin N hp ng sn xut sn phm (M >= N). Mi nhn vin ch tham gia thc hin mt hp ng. Ngi ta d tnh rng, nu phn cng i nhn vin tham gia thc hin hp ng j th c thi gian hon thnh hp ng l T[i,j]. Hy tm phng n phn cng mi hp ng bao nhiu nhn vin sao cho tng s thi gian hon thnh N hp ng l t nht. 11. Cho ma trn vung cp 8 cha cc s nguyn. Tm gi tr ln nht ca tng 8 s hng trn ma trn s trn sao cho 2 s hng bt k trong 8 s hng trn khng nm trn cng mt hng, khng cng nm trn mt ct v khng cng nm trn ng cho . 12. Cho mt bng A c M hng, N ct (3 M, N 50), Mi phn t ca bng l mt s nguyn nhn gi tr t 0 n 99. Cho mt s K (2 K Min(M, N)). Tm K phn t trong bng A tng ca K phn t ny l ln nht, vi iu kin l trn mi hng chn nhiu nht mt phn t, mi ct chn nhiu nht mt phn t.
55

You might also like