Tải bản đầy đủ (.pdf) (27 trang)

Kỹ thuật thiết kế giải thuật

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.84 MB, 27 trang )

Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 36
1. Mc tiêu
2. Kin thc c bn cn có  hc chng này
3. Tài liu tham kho có liên quan n chng
4. Ni dung:
III.1 - Gii thut chia  tr
III.2 - Quy hoch ng
III.3 - K thut "tham n"
III.4 - K thut quay lui
III.5 - K thut tìm kim a phng
5. Vn  nghiên cu ca trang k tip
Nói chung khi thit k mt gii thut chúng ta thng da vào mt s k thut n
ào ó. Chng
này s trình bày mt s k thut quan trng  thit k gii thut nh: Chia  tr (Divide-and-
Conquer), quy hoch ng (dynamic programming), k thut tham n (greedy techniques), quay lui
(backtracking) và tìm kim a phng (local search). Các k thut này c áp dng vào mt lp
ng các bài toán, trong ó có nhng bài toán ni ting nh bài toán tìm ng i ngn nht ca ngi
giao hàng, bài toán cây ph ti tiu...
III.1- GII THUT CHIA  TR
III.1.1- Ni dung k thut
III.1.2- Nhìn nhn li gii thut MergeSort và QuickSort
III.1.3- Bài toán nhân các s nguyên ln
III.1.4- Xp lch thi u th thao
III.1.5- Bài toán con cân bng
III.1.1- Ni dung k thut
Có th nói rng k thut quan trng nht, c áp dng rng rãi nht  thit k các gii thut
có hiu qu là k thut "chia  tr" (divide and conquer). Ni dung ca nó là:  gii mt bài toán
kích thc n, ta chia bài toán ã cho thành mt s bài toán con có kích thóc nh hn. Gii các bài
toán con này ri tng hp kt qu li c li gii ca bài toán ban u. i vi các bài toán con,
chúng ta li s dng k thut chia  tr có c các bài toán kích thc nh hn na. Quá trình trên


 dn n nhng bài toán mà li gii chúng là hin nhiên hoc  dàng thc hin, ta gi các bài toán
này là bài toán c s.
Tóm li k thut chia  tr bao gm hai quá trình: Phân tích bài toán ã cho thành các bài
toán c s và ng hp kt qu t bài toán c s có li gii ca bài toán ban u. Tuy nhiên i vi
t s bài toán, thì quá trình phân tích ã cha ng vic tng hp kt qu do ó nu chúng ta ã gii
xong các bài toán c s thì bài toán ban u cng ã c gii quyt. Ngc li có nhng bài toán mà
quá trình phân tích thì n gin nhng vic tng hp kt qu li rt khó khn. Trong các phn tip sau
ta s trình bày mt s ví d thy rõ hn u này.
 thut này s cho chúng ta mt gii thut  quy mà vic xác nh  phc tp ca nó s
phi gii mt phng trình  quy nh trong chng I ã trình bày.
Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 37
III.1.2 Nhìn nhn li gii thut MergeSort và QuickSort
Hai gii thut sp xp ã c trình bày trong các chng trc (MergeSort trong chng I và
QuickSort trong chng II) thc cht là ã s dng k thut chia  tr.
i MergeSort,  sp mt danh sách L gm n phn t, chúng ta chia L thành hai danh sách
con L1 và L2 mi danh sách có n/2 phn t. Sp xp L1, L2 và trn hai danh sách ã c sp này 
c mt danh sách có th t. Quá trình phân tích ây là quá trình chia ôi mt danh sách, quá trình
này s dn n bài toán sp xp mt danh sách có  daì bng 1, ây chính là bài toán c s vì vic sp
p danh sách này là “không làm gì c”. Vic tng hp các kt quây là “trün 2 danh sách ã
c sp c mt danh sách có th t”.
i QuickSort,  sp xp mt danh sách gm n phn t, ta tìm mt giá tr cht và phân hoch
danh sách ã cho thành hai danh sách con “bên trái” và “bên phi “. Sp xp “bên trái” và “bên phi”
thì ta c danh sách có th t. Quá trình phân chia s dn n các bài toán sp xp mt danh sách ch
m mt phn t hoc gm nhiu phn t có khoá bng nhau, ó chính là các bài toán c s, vì bn
thân chúng ã có th t ri. ây chúng ta cng không có vic tng hp kt qu mt cách tng
minh, vì vic ó ã c thc hin trong quá trình phân hoch.
III.1.3- Bài toán nhân các s nguyên ln
Xét bài toán nhân hai s nguyên n ch s X và Y. Theo gii thut nhân hai s thông thng thì
n n

2
phép nhân và n phép cng nên tn O(n
2
) thi gian. Áp dng k thut "chia  tr" vào phép nhân
các s nguyên, ta chia mi s nguyên X và Y thành các s nguyên có n/2 ch s. n gin ta gi s
n là lu tha ca 2
X = A10n/2 + B
Y = C10n/2 + D
Trong ó A, B, C, D là các s nguyên có n/2 ch s.
Chng hn vi X = 1234 thì A = 12 và B = 34 bi vì X = 12 *10
2
+ 34.
Tích ca X và Y có thc vit thành: XY = AC10
n
+(AD + BC)10
n/2
+ BD (III.1)
i mi s có n/2 ch s, chúng ta li tip tc phân tích theo cách trên, quá trình phân tích s
n n bài toán c s là nhân các s nguyên ch gm mt ch s mà ta d dàng thc hin. Vic tng
p kt qu chính là thc hin các phép toán theo công thc (III.1).
Theo (III.1) thì chúng ta phi thc hin 4 phép nhân các s nguyên n/2 ch s (AC, AD, BC,
BD), sau ó tng hp kt qu bng 3 phép cng các s nguyên n ch s và 2 phép nhân vi 10
n

10
n/2
.
Các phép cng các s nguyên n ch s d nhiên ch cn O(n). Phép nhân vi 10
n
có th thc

hin mt cách n gin bng cách thêm vào n ch s 0 và do ó cng ch ly O(n). Gi T(n) là thi
gian  nhân hai s nguyên, mi s có n ch s thì t (III.1) ta có:
T(1) = 1
T(n) = 4T(n/2) + cn (III.2)
Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 38
Gii (III.1) ta c T(n) = O(n
2
). Nh vy thì chng ci tin c chút nào so vi gii thut
nhân hai s bình thng.  ci thin tình hình, chúng ta có th vit li (III.1) thành dng:
XY = AC10
n
+ [(A-B)(D-C) + AC + BD] 10
n/2
+ BD (III.3)
Công thc (III.3) chòi hi 3 phép nhân ca các s nguyên n/2 ch s là: AC, BD và (A-
B)(D-C), 6 phép cng tr và 2 phép nhân vi 10
n
. Các phép toán này u ly O(n) thi gian. T (III.3)
ta có phng trình  quy:
T(1) = 1
T(n) = 3T(n/2) + cn
Gii phng trình  quy này ta c nghim T(n) = O(n
log3
) = O(n
1.59
). Gii thut này rõ ràng
ã c ci thin rt nhiu.
Gii thut thô  nhân hai s nguyên (dng hoc âm) n ch s là:
function Mult(x,y:integer; n:integer) : integer;

var
m1,m2,m3,A,B,C,D: integer;
s:integer;{Lu tr du ca tích xy}
begin
s := sign(x)*sign(y);
{Hàm sign có giá tr 1 nu x dng và –1 nu x âm}
x := ABS(x);{Ly tr tuyt i ca x}
y := ABS(y);
if n = 1 then mult:=x*y*s
else begin
A := left( x, n DIV 2);
B := right(x, n DIV 2);
C := left(y, n DIV 2);
D := right(y, n DIV 2);
m1 := mult(A,C, n DIV 2);
m2 := mult(A-B,D-C, n DIV 2);
m3 := mult(B,D, n DIV 2);
mult := (s * (m1 * 10n + (m1+m2+m3)* 10 n DIV 2 + m3));
end
end;
III.1.4- Xp lch thi u th thao
K thut chia  tr không nhng ch có ng dng trong thit k gii thut mà còn trong nhiu
nh vc khác ca cuc sng. Chng hn xét vic xp lch thi u th thao theo th thc u vòng tròn 1
t cho n cu th. Mi cu th phi u vi các cu th khác, và mi cu th chu nhiu nht mt
trn mi ngày. Yêu cu là xp mt lch thi u sao cho s ngày thi u là ít nht. Ta d dàng thy rng
ng s trn u ca toàn gii là n(n-1)/2. Nh vy nu n là mt s chn thì ta có th sp n/2 cp thi u
trong mt ngày và do ó cn ít nht n-1 ngày. Ngc li nu n là mt s l thì n-1 là mt s chn nên ta
có th sp (n-1)/2 cp thi u trong mt ngày và do ó ta cn n ngày. Gi s n = 2
k
thì n là mt s chn

Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 39
và do ó cn ti thiu n-1 ngày.
Lch thi u là mt bng n dòng và n-1 ct. Các dòng c ánh s t 1 n n và các ct c
ánh s t 1 n n-1, trong ó dòng i biu din cho cu th i, ct j biu din cho ngày thi u j và ô(i,j)
ghi cu th phi thi u vi cu th i trong ngày j.
Chin lc chia  tr xây dng lch thi u nh sau:  sp lch cho n cu th, ta s sp lch
cho n/2 cu th,  sp lch cho n/2 cu th, ta s sp lch cho n/4 cu th... Quá trình này s dn n
bài toán c s là sp lch thi u cho 2 cu th. Hai cu th này s thi u mt trn trong mt ngày, lch
thi u cho h tht d sp. Khó khn chính là  ch t các lch thi u cho hai cu th, ta tng hp li
c lch thi u ca 4 cu th, 8 cu th, ...
Xut phát t lch thi u cho hai cu th ta có th xây dng lch thi u cho 4 cu th nh sau:
ch thi u cho 4 cu th s là mt bng 4 dòng, 3 ct. Lch thi u cho 2 cu th 1 và 2 trong ngày
th 1 chính là lch thi u ca hai cu th (bài toán c s). Nh vy ta có Ô(1,1) = “2” và Ô(2,1) = “1”.
ng t ta có lch thi u cho 2 cu th 3 và 4 trong ngày th 1. Ngha là Ô(3,1) =”4” và Ô(4,1) =
“3”. (Ta c th thy rng Ô(3,1) = Ô(1,1) + 2 và Ô(4,1) = Ô(2,1) + 2 ). Bây gi hoàn thành lch thi
u cho 4 cu th, ta ly góc trên bên trái ca bng lp vào cho góc di bên phi và ly góc di bên
trái lp cho góc trên bên phi.
Lch thi u cho 8 cu th là mt bng gm 8 dòng, 7 ct. Góc trên bên trái chính là lch thi u
trong 3 ngày u ca 4 cu th t 1 n 4. Các ô ca góc di bên trái s bng các ô tng ng ca góc
trên bên trái cng vi 4. ây chính là lch thi u cho 4 cu th 5, 6, 7 và 8 trong 3 ngày u. Bây gi
chúng ta hoàn thành vic sp lch bng cách lp y góc di bên phi bi góc trên bên trái và góc trên
bên phi bi góc di bên trái.
III.1.5- Bài toán con cân bng (Balancing Subproblems)
i vi k thut chia  tr, nói chung s tt hn nu ta chia bài toán cn gii thành các bài toán
con có kích thc gn bng nhau. Ví d, sp xp trn (MergeSort) phân chia bài toán thành hai bài
toán con có cùng kích thc n/2 và do ó thi gian ca nó ch là O(nlogn). Ngc li trong trng hp
u nht ca QuickSort, khi mng b phân hoch lch thì thi gian thc hin là O(n
2
).

Nguyên tc chung là chúng ta tìm cách chia bài toán thành các bài toán con có kích thc xp x bng
nhau thì hiu sut s cao hn.
III.2- QUY HOCH NG
Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 40
III.2.1- Ni dung k thut
III.2.2- Bài toán tính s t hp
III.2.1- Ni dung k thut
Nh trong III.1 chúng ta ã nói, k thut chia  tr thng dn chúng ta ti mt gii thut 
quy. Trong các gii thut ó, có th có mt s gii thut thi gian m. Tuy nhiên, thng ch có mt s
a thc các bài toán con, u ó có ngha là chúïng ta ã phi gii mt s bài toán con nào ó trong
nhiu ln.  tránh vic gii d tha mt s bài toán con, chúng ta to ra mt bng lu tt c kt qu
a các bài toán con và khi cn chúng ta ch cn tham kho ti kt quã c lu trong bng mà
không cn phi gii li bài toánó. Lp y bng kt qu các bài toán con theo mt quy lut nào ó
 nhn c kt qu ca bài toán ban u (cng ã c lu trong mt ô nào ó ca bng) c gi là
quy hoch ng.
III.2.2- Bài toán tính s t hp
Mt bài toán khá quen thuc vi chúng ta là tính s t hp chp k ca n theo công thc:
C
k
n
= 1 nu k=0 hoc k = n
C
k
n
= C
k-1
n-1
+ C
k

n-1
nu 0 < k < n
Công thc trên ã gi ý cho chúng ta mt gii thut  quy nh sau:
function Comb(n,k : integer) : Integer;
begin
if (k=0) or (k=n) then Comb := 1
else Comb := Comb(n-1, k-1) + Comb(n-1,k);
end;
Gi T(n) là thi gian  tính s t hp chp k ca n, thì ta có phng trình  quy:
T(1) = C1
T(n) = 2T(n-1) + C2
Gii phng trình này ta c T(n) = O(2
n
), nh vy là mt gii thut thi gian m, trong khi
ch có mt a thc các bài toán con. u ó chng t rng có nhng bài toán con c gii nhiu ln.
Chng hn  tính Comb(4,2) ta phi tính Comb(3,1) và Comb(3,2).  tính Comb(3,1) ta phi
tính Comb(2,0) và Comb(2,1).  tính Comb(3,2) ta phi tính Comb(2,1) và Comb(2,2). Nh vy 
tính Comb(4,2) ta phi tính Comb(2,1) hai ln. Hình 3-2 sau minh ho rõ u ó.
Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 41
Áp dng k thut quy hoch ng  khc phc tình trng trên, ta xây dng mt bng gm n+1
dòng (t 0 n n) và n+1 ct (t 0 n n) và n giá tr cho O(i,j) theo quy tc sau: (Quy tc tam giác
Pascal):
O(0,0) = 1;
O(i,0) =1;
O(i,i) = 1 vi 0 < i ( n;
O(i,j) = O(i-1,j-1) + O(i-1,j) vi 0 < j < i £ n.
Chng hn vi n = 4 ta có bng bên.
O(n,k) chính là Comb(n,k) và ta có gii thut nh sau:
function Comb(n, k : Integer) : Integer

var C: array[0..n, 0..n] of integer;
i,j : integer;
begin
{1} C[0,0] := 1;
{2} for i := 1 to n do begin
{3} C[i,0] := 1;
{4} C[i,i] := 1;
{5} for j := 1 to i-1 do C[i,j] := C[i-1,j-1] + C[i-1,j];
end;
{6} Comb := C[n,k];
end;
Vòng lp {5} thc hin i-1 ln, mi ln O(1). Vòng lp {2} có i chy t 1 n n, nên nu gi
T(n) là thi gian thc hin gii thut thì ta có:
III.3- K THUT "THAM N"
III.3.1- Bài toán ti u t hp
III.3.2- Ni dung k thut tham n
III.3.3- Bài toán ng i ca ngi giao hàng
III.3.4- Bài toán cái ba lô
Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 42
III.3.1- Bài toán ti u t hp
Là mt dng ca bài toán ti u, nó có dng tng quát nh sau:
· Cho phim hàm xác nh trên mt tp hu hn các phn t D. Hàm
f(X) c gi là hàm mc tiêu.
· Mi phn t X D có dng X= (x
1
, x
2
, .. x
n

) c gi là mt phng án.
· Cn tìm mt phng án X D sao cho hàm f(X) t min (max). Phng án X nh thc
i là phng án ti u.
Ta có th tìm thy phng án ti u bng phng pháp “vét cn” ngha là xét tt c các
phng án trong tp D (hu hn)  xác inh phng án tt nht. Mc dù tp hp D là hu hn nhng
 tìm phng án ti u cho mt bài toán kích thc n bng phng pháp “vét cn” ta có th cn mt
thi gian m.
Các phn tip theo ca chng này s trình bày mt s k thut gii bài toán ti u t hp mà
thi gian có th chp nhn c.
III.3.2- Ni dung k thut tham n
K thut tham n thng c vn dng  gii bài toán ti u t hp bng cách xây dng mt
phng án X. Phng án X c xây dng bng cách la chn tng thành phn xi ca X cho n khi
hoàn chnh ( n thành phn). Vi mi xi , ta s chn xi ti u. Vi cách này thì có th bc cui
cùng ta không còn gì  chn mà phi chp nhn mt giá tr cui cùng còn li.
Áp dng k thut tham n s cho mt gii thut thi gian a thc, tuy nhiên nói chung chúng
ta cht c mt phng án tt ch không phi là ti u.
Có rt nhiu bài toán mà ta có th gii bng k thut này, sau ây là mt s ví d.
III.3.3- Bài toán ng i ca ngi giao hàng
Chúng ta s xét mt bài toán rt ni ting có tên là bài toán tìm ng i ca ngi giao
hàng (TSP - Traveling Salesman Problem): Có mt ngi giao hàng cn i giao hàng ti n thành ph.
Xut phát t mt thành ph nào ó, i qua các thành ph khác  giao hàng và tr v thành ph ban
u. Mi thành ph chn mt ln, khong cách t mt thành phn các thành ph khác là xác nh
c. Khong cách gia hai thành ph có th là khong cách a lý, có th là cc phí di chuyn hoc
thi gian di chuyn. Ta gi chung là  dài. Hãy tìm mt chu trình (mt ng i khép kín tha mãn
u kin trên) sao cho tng  dài các cnh là nh nht. Hay còn nói là tìm mt phng án có giá nh
nht. Bài toán này cng c gi là bài toán ngi du lch.
Vi phng pháp vét cn ta xét tt c các chu trình, mi chu trình tính tng  dài các cnh
a nó ri chn mt chu trình có tng  dài nh nht. Tuy nhiên chúng ta cn xét tt c là chu
trình. Thc vy, do mi chu trình u i qua tt c các nh (thành ph) nên ta có th cnh mt nh.
nh này ta có n-1 cnh ti n-1 nh khác, nên ta có n-1 cách chn cnh u tiên ca chu trình. Sau

khi ã chn c cnh u tiên, chúng ta còn n-2 cách chn cnh th hai, do ó ta có (n-1)(n-2) cách
Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 43
chn hai cnh. C lý lun nh vy ta s thy có (n-1)! cách chn mt chu trình. Tuy nhiên vi mi chu
trình ta ch quan tâm n tng  dài các cnh ch không quan tâm n hïng i theo chiu dng
hay âm vì vy có tt c phng án. ó là mt gii thut thi gian m !!!.
 thut tham n áp dng vào ây là:
1. Tính  dài ca tt c các cnh (có tt c nh).
2. Xét các cnh có  dài t nhn ln a vào chu trình.
3. Mt cnh sc a vào chu trình nu cnh ó tha mãn hai u kin sau:
· Không to thành mt chu trình thiu (không i qua  n nh)
· Không to thành mt nh có cp  3 (tc là không c có nhiu hn hai cnh xut phát
 mt nh, do yêu cu ca bài toán là mi thành ph chc n mt ln: mt ln n và mt ln i)
4. Lp li bc 3 cho n khi xây dng c mt chu trình.
Vi k thut này ta ch cn n(n-1)/2 phép chn nên ta có mt gii thut cn O(n
2
) thi gian.
Ví d 3-1: Cho bài toán TSP vi 6 nh c cho bi các ta  nh sau:
Do có 6 nh nên có tt c 15 cnh. ó là các cnh: ab, ac, ad, ae, af, bc, bd, be, bf, cd, ce, cf,
de, df và ef.  dài các cnh ây là khong cách Euclide. Trong 15 cnh này thì de = 3 là nh nht,
nên de c chn vào chu trình. Kn là 3 cnh ab, bc và ef u có  dài là 5. C 3 cnh u tha
mãn hai u kin nói trên, nên u c chn vào chu trình. Cnh có  dài nh k tip là ac = 7.08,
nhng không tha cnh này vào chu trình vì nó s to ra chu trình thiu (a-b-c-a). Cnh df cng b
loi vì lý do tng t. Cûnh be c xem xét nhng ri cng b loi do to ra nh b và nh e có cp
3. Tng t chúng ta cng loi bd. cd là cnh tip theo c xét và c chn. Cui cùng ta có chu
trình a-b-c-d-e-f-a vi tng  dài là 50.
Collected by The_Wall (11/10/2005)
Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 44
ây ch là mt phng án tt.
Phng án ti u là chu trình a-c-d-e-f-b-a vi tng  dài là 48.39.

Gii thut s b nh sau:
procedure TSP;
begin
{E là tp các cnh }
{Sp xp các cnh trong E theo th t tng ca  dài }
Chu_Trinh := F;
Gia := 0.0;
while E <> F do begin
if cnh e có th chn then begin
Chu_Trinh := Chu_Trinh + e ;
Gia := Gia +  dài ca e;
end;
E := E-e;
end ;
end;
Mt cách tip cn khác ca k thut tham n vào bài toán này là:
1. Xut phát t mt nh bt k, chn mt cnh có  dài nh nht trong tt c các cnh i ra t
nh ó n nh k tip.
2. Tnh k tip ta li chn mt cnh có  dài nh nht i ra tnh này tho mãn hai u
kin nói trên i n dnh k tip.
3. Lp li bc 2 cho n khi i ti nh n thì quay tr vnh xut phát.
III.3.4- Bài toán cái ba lô
Cho mt cái ba lô có thng mt trng lng W và n loi  vt, mi  vt
i có mt trng lng gi và mt giá tr vi. Tt c các loi  vt u có s lng không hn ch. Tìm
t cách la chn các  vt ng vào ba lô, chn các loi  vt nào, mi loi ly bao nhiêu sao cho
ng trng lng không vt quá W và tng giá tr là ln nht.
Theo yêu cu ca bài toán thì ta cn nhng  vt có giá tr cao mà trng lng li nh sao
cho có th mang c nhiu “ quý”, s là hp lý khi ta quan tâm n yu t “n giá” ca tng loi
 vt tc là t l giá tr/trng lng. n giá càng cao thì  càng quý. Tó ta có k thut greedy áp
Collected by The_Wall (11/10/2005)

Giáo trình môn Phân tích Gii Thut – I C CN TH........................................................................Trang 45
ng cho bài toán này là:
1. Tính n giá cho các loi  vt.
2. Xét các loi  vt theo th tn giá t ln n nh.
3. Vi mi  vt c xét s ly mt s lng ti a mà trng lng còn li ca ba lô cho
phép.
4. Xác nh trng lung còn li ca ba lô và quay li bc 3 cho n khi không còn có th
chn c  vt nào na.
Ví d 3-2: Ta có mt ba lô có trng lng làì 37 và 4 loi  vt vi trng lng và giá tr
ng ng c cho trong bng (hình 3-6)
T bng ã cho ta tính n giá cho các loi  vt và sp xp các loi  vt này theo th t
n giá gim dn ta có bng (hình 3-7).
Theo ó thì th tu tiên  chn  vt là là B, A, D và cui cùng là C.
Vt B c xét u tiên và ta chn ti a 3 cái vì mi cái vì trng lng mi cái là 10 và ba lô
có trng lng 37. Sau khi ã chn 3 vât loi B, trng lng còn li trong ba lô là 37 - 3*10 = 7. Ta xét
n vt A, vì A có trng lng 15 mà trng lng còn li ca balô ch còn 7 nên không th chn vt A.
Xét vt D và ta thy có th chn 1 vt D, khi ó trng lng còn li ca ba lô là 7-4 = 3. Cui cùng ta
chn c mt vt C.
Nh vy chúng ta ã chn 3 cái loi B, mt cái loi D và 1 cái loi C. Tng trng lng là
3*10 + 1*4 + 1*2 = 36 và tng giá tr là 3*25+1*6+1*2 = 83.
Chú ý có mt s bin th ca bài toán cái ba lô nh sau:
1. Mi  vt i ch có mt s lng si. Vi bài toán này khi la chn vt i ta không c ly
t s lng vt quá si.

×