Sunteți pe pagina 1din 22

Metoda greedy

Prezentarea metodei
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
2


2.1. Metoda greedy
Metoda rezolv probleme de optim n care soluia se construiete pe parcurs. Optimul
global se determin prin estimri succesive ale optimului local. Dintr-o mulime de
elemente A trebuie determinat o submulime B, care verific anumite condiii i care,
de obicei, este soluia unei probleme de optimizare. Soluia problemei se construiete
treptat. Iniial B este mulimea vid. Se adaug n B succesiv elemente din A, atingn-
du-se de fiecare dat un optim local. Dar, aceast construire nu asigur ntotdeauna
atingerea unui optim global. De aceea metoda greedy nu poate fi aplicat dect dac se
demonstreaz c modul de construire a mulimii B duce la obinerea unui optim
global.
Datorit modului de construire a soluiei, metoda se mai numete metoda optimu-
lui local.

Exemplu
Dintre cei n elevi ai unei coli, trebuie selectat un lot de k elevi care s participe la
un concurs de atletism. Bineneles c ne vom grbi s alegem elevii care au mai avut
rezultate la alte concursuri sau pe cei cu nclinaii n acest sens. Probabil, vom stabili
cteva criterii de selectare: rezultate anterioare, timpi nregistrai la ora de sport etc.,
pe baza crora vom ntocmi un punctaj. Promitor va fi elevul care realizeaz punctaj
maxim. n continuare, dintre cei rmai, vom selecta elevul cu urmtorul punctaj i tot
aa pn la alegerea celor k elevi. Alegerea ct mai bun a criteriilor va duce la alege-
rea unui lot performant.

Forma general a metodei greedy:



2. Metoda greedy 69

Subalgoritm Greedy(A,B):
B
ct timp nu Soluie(B) i A execut:
Alege(A,b)
Elimin(A,b)
dac Posibil(B,b) atunci
Adaug(B,b)
sfrit dac
sfrit ct timp
dac Soluie(B) atunci
scrie B
altfel
scrie 'Nu s-a gasit solutie.'
sfrit dac
sfrit subalgoritm

n acest algoritm am utilizat urmtoarele subalgoritmi:
Subalgoritmul Soluie(B) de tip funcie verific dac B este soluie optim a
problemei;
Alege(A,b) extrage cel mai promitor element b din mulimea A pe care l poate
alege la un moment dat;
Subalgoritmul Posibil(B,b) de tip funcie verific dac este posibil s se obin
o soluie, nu neaprat optim, prin adugarea lui b la mulimea B.

Observaii
1. La fiecare pas se alege cel mai promitor element la momentul respectiv. Dac un
element se introduce n mulimea B, el nu va fi niciodat eliminat de acolo.
2. Dac se alege un element din A care nu se poate aduga mulimii B, el se elimin
din A i nu se mai testeaz ulterior.
3. n rezolvarea problemelor, de multe ori este util ordonarea mulimii A nainte ca
algoritmul propriu-zis s fie aplicat n funcie de cerinele problemei. Datorit or-
donrii, elementele din A vor fi testate pe rnd, ncepnd cu primul. Dac mulimea
A se memoreaz ntr-un tablou cu n elemente a
1
, a
2
, , a
n
, algoritmul Greedy
devine:

Subalgoritm Greedy(n,a,B):
Ordonare(n,a)
B
i 1
ct timp nu Soluie(B) i (i n) execut:
dac Posibil(B,a
i
) atunci
Adaug(B,a
i
)
sfrit dac
70 2. Metoda greedy

i i + 1
sfrit ct timp
dac Soluie(B) atunci
scrie B
altfel
scrie 'Nu s-a gasit solutie.'
sfrit dac
sfrit subalgoritm

Algoritmii de tip greedy nu asigur ntotdeauna gsirea soluiei optime, chiar dac
la fiecare pas se determin soluia optim pentru pasul respectiv. De aceea, n momen-
tul n care rezolvm o problem prin aceast metod, va trebui s gsim o demonstra-
ie matematic riguroas referitoare la optimalitatea global a soluiei. De cele mai
multe ori ea se face prin inducie matematic sau prin reducere la absurd.

2.2. Implementri sugerate
Pentru a v familiariza cu modul n care se abordeaz problemele n care trebuie apli-
cat metoda greedy, v sugerm s implementai algoritmi pentru:
1. determinarea ordinii n care se vor servi persoanele care stau la o coad, astfel nct
timpul mediu de ateptare s fie minim;
2. determinarea submulimii de sum maxim a unei mulimi de numere reale date;
3. eliminarea unor puncte date de-a lungul unei linii drepte, astfel nct distana mini-
m dintre oricare dou puncte succesive s fie cel puin egal cu o distan dat;
4. problema benzii magnetice (S se stabileasc ordinea n care se vor nregistra N
fiiere pe o band magnetic, astfel nct timpul mediu de accesare a lor s fie mi-
nim. Se tie c pentru accesarea unui fiier, toate cele nregistrate naintea lui tre-
buie citite.);
5. problema continu a rucsacului (ntr-un rucsac ncap obiecte de greutate total G.
Cunoscnd greutile i valorile a N obiecte, s se determine care trebuie mpache-
tate n rucsac pentru a obine o valoare total maxim.);
6. obinerea unei configuraii de N numere plasate pe N + 1 poziii (o poziie fiind li-
ber) dintr-o configuraie iniial dat n care exist, de asemenea, o poziie neocu-
pat de nici un numr; un numr poate fi mutat dintr-o anumit poziie doar n po-
ziia liber;
7. eliminarea de ctre doi juctori a unor numere dintr-un ir de numere, tergnd un
numr de la una din marginile irului; se declar ctigtor cel care terge numere
avnd suma maxim;
8. nchirierea unei cabane pe anumite intervale de timp solicitate, astfel nct numrul
solicitanilor servii s fie maxim;


2. Metoda greedy 71

9. problema spectacolelor (ntr-o sal de spectacole trebuie planificate ct mai multe
spectacole dintre cele N existente n repertoriu, astfel nct fiecare s respecte ora
de ncepere i de ncheiere planificate.)
10. descompunerea unui ir de numere dat n numr minim de subiruri descresctoare;
ordinea din subiruri trebuie s fie aceeai cu ordinea din irul dat:
11. coduri Huffman;
12. analiza problemei plii sumei cu bancnote de valori date; gsirea unei mulimi de
monede pentru care algoritmul furnizeaz (respectiv nu furnizeaz) soluie optim.

2.3. Probleme propuse

2.3.1. Meniuri
La inaugurarea unui restaurant sunt prezente mai multe persoane. Clienii i aleg din
meniul pus la dispoziie cte o specialitate. Dar deocamdat restaurantul a angajat un
singur buctar care pregtete mncrurile una dup alta, deci clienii nu pot fi servii
dect pe rnd. Presupunnd c buctarul se apuc de lucru dup ce s-au strns toate
comenzile, stabilii n ce ordine trebuie s pregteasc specialitile, astfel nct timpul
mediu de ateptare a clienilor s fie minim.

Date de intrare
Prima linie a fiierului de intrare MENIU.IN conine un numr natural n, reprezentnd
numrul clienilor. Urmtoarea linie conine n numere ntregi, reprezentnd timpul ne-
cesar pregtirii mncrurilor comandate, n ordine, pentru cele n persoane. Aceste nu-
mere vor fi separate prin cte un spaiu.

Date de ieire
Fiierul de ieire MENIU.OUT va conine dou linii. Pe prima linie se va scrie un nu-
mr real cu dou zecimale, reprezentnd timpul mediu de ateptare, iar pe a doua linie
se vor afla n numere, reprezentnd numerele de ordine ale persoanelor din restaurant,
n ordinea n care trebuie servite.

Restricii i precizri
1 n 1000;
1 t 100, unde t reprezint timpul necesar preparrii unei specialiti de mncare;
dac exist mai multe soluii, n fiier se va scrie una singur.

Exemplu
MENIU.IN
5
30 40 20 25 60
MENIU.OUT
86.00
3 4 1 2 5
72 2. Metoda greedy

2.3.2. Submulimi
Se consider o mulime avnd n elemente numere ntregi. S se determine o submuli-
me de sum maxim a acesteia.

Date de intrare
Prima linie a fiierului de intrare SUBM.IN conine numrul n, iar pe urmtoarea linie
se afl cele n numere ntregi, separate prin cte un spaiu.

Date de ieire
Fiierul de ieire SUBM.OUT va conine o singur linie pe care se vor afla numerele din
submulimea de sum maxim, separate prin cte un spaiu.

Restricii i precizri
1 n 1000
Dac problema are mai multe soluii, n fiier se va scrie una singur.

Exemplu
SUBM.IN
7
3 6 0 2 7 3
SUBM.OUT
3 6 2 7

2.3.3. Maximizare
Se dau mulimile A = {a
1
, a
2
, ..., a
m
} i B = {b
1
, b
2
, , b
n
} avnd elemente numere n-
tregi nenule. Se tie c n m.
S se determine o submulime B' = {x
1
, x
2
, , x
m
} a lui B, astfel nct valoarea ex-
presiei E = a
1 *
x
1
+ a
2 *
x
2
++ a
m *
x
m
s fie maxim i s se calculeze expresia E.

Date de intrare
Prima linie a fiierului de intrare MAXIM.IN conine numerele m i n, desprite printr-
un spaiu. A doua i a treia linie conin elementele numere ntregi ale mulimii A, res-
pectiv B. Numerele sunt separate prin cte un spaiu.

Date de ieire
Fiierul de ieire MAXIM.OUT va conine o singur linie pe care se va afla un numr n-
treg, care reprezint valoarea expresiei E.

Restricii i precizri
1 m, n 100.



2. Metoda greedy 73

Exemplu
MAXIM.IN
3 5
2 4 3
5 3 8 1 2
MAXIM.OUT
51

2.3.4. Staii
Patronul unei companii private de transport n comun a primit de la primria oraului
aprobarea de a putea folosi o parte din staiile Regiei Locale de Transport n Comun.
Staiile disponibile sunt situate de-a lungul arterei principale a oraului.
El se hotrte s introduc o curs rapid care s strbat oraul, de la un capt la
cellalt, pe artera principal. Pentru nceput se ocup de staiile situate de aceeai parte
a drumului. Patronul are o dilem: dac opririle vor fi prea dese, atunci strbaterea
oraului va dura prea mult i va plictisi cltorii, iar dac staiile sunt prea rare,
cltorii vor fi prea puini. De aceea, criteriile dup care patronul stabilete staiile n
care va opri cursa rapid sunt:
ntre dou staii alturate s fie cel puin x metri.
Numrul total de staii s fie maxim.
Ajutai patronul s aleag staiile!

Date de intrare
Vom considera staiile situate pe aceeai parte a arterei principale numerotate n ordi-
ne, dintr-un capt pn n cellalt cu 1, 2, , n.
Prima linie a fiierului de intrare STATII.IN conine un numr natural n, reprezen-
tnd numrul de staii situate pe artera principal. Urmtoarea linie conine n 1 nu-
mere ntregi a
i
,

i = 1, 2, , n 1 cu semnificaia: a
i
este distana dintre staia i i staia
i + 1. Aceste numere vor fi separate prin cte un spaiu.

Date de ieire
Fiierul de ieire STATII.OUT va conine dou linii. Pe prima linie se va scrie un nu-
mr ntreg k care reprezint numrul maxim de staii alese de patron, iar pe a doua li-
nie se vor afla k numere, reprezentnd numerele de ordine ale acestor staii. Numerele
vor fi scrise n ordine cresctoare.

Restricii i precizri
1 n 1000;
1 a
i
2000, i = 1, 2, ..., n 1;
1 k 1000;
Dac exist mai multe soluii, n fiier se va scrie una singur.


74 2. Metoda greedy

Exemplu
STATII.IN
10 60
100 50 25 25 50 10 10 80 20
STATII.OUT
5
1 2 5 8 9

2.3.5. Rucsac
Un ho d o spargere la un magazin, gsind n obiecte. Fiecare obiect are o greutate i o
valoare. tiind c n rucsac nu poate pune obiecte a cror greutate total depete va-
loarea dat G, s se precizeze ce obiecte trebuie s ia houl pentru a avea un ctig ma-
xim. Houl a decis s nu ia neaprat obiectele ntregi, el poate lua i buci din acestea,
ns n cazul acesta valoarea obiectului scade proporional cu greutatea.

Date de intrare
Considerm obiectele numerotate cu 1, 2, , n. Prima linie a fiierului RUCSAC.IN
conine numrul n al obiectelor disponibile i numrul real G, reprezentnd capacitatea
rucsacului. Linia a doua conine n numere ntregi separate prin spaii, reprezentnd
greutile celor n obiecte. Linia a treia conine n numere ntregi, care reprezint valori-
le celor n obiecte.

Date de ieire
Fiierul de ieire RUCSAC.OUT va conine dou linii. Pe prima linie se va scrie un nu-
mr real cu dou zecimale exacte, reprezentnd valoarea total a obiectelor selectate,
iar pe linia a doua se vor scrie numerele de ordine ale obiectelor alese, separate prin
cte un spaiu.

Restricii i precizri
1 n 100;
n cazul n care un obiect se taie, n fiierul de ieire indicele acestuia va fi scris
ultimul.
Dac problema admite mai multe soluii, n fiier se va scrie una singur.

Exemplu
RUCSAC.IN
3 5.5
3 3 4
3 2 8
RUCSAC.OUT
9.50
3 1


2.3.6. Cutii
Al Bundy este n dificultate! Are n + 1 cutii de pantofi i n perechi de pantofi identifi-
cate prin valorile 1, 2, , n (n perechi sunt aezate n n cutii, iar o cutie este liber).
Dar, din pcate, pantofii nu se afl la locurile lor. Pn s vin Gary (efa lui), Bundy
trebuie s potriveasc pantofii n cutii. Dar pentru c Gary poate s apar n orice clip
i Bundy nu vrea s fie prins c nu i face treaba cum trebuie, aranjarea pantofilor tre-
2. Metoda greedy 75

buie fcut rapid i n aa fel nct s nu trezeasc bnuieli; prin urmare, dac scoate o
pereche de pantofi dintr-o cutie, trebuie s o pun imediat n cutia liber. Ajutai-l pe
Al Bundy s aranjeze pantofii la locurile lor printr-un numr minim de mutri.

Date de intrare
Prima linie a fiierului de intrare CUTII.IN conine numrul n de cutii. Linia a doua
conine n + 1 numere distincte, separate prin cte un spaiu, reprezentnd dispunerea
iniial a perechilor de pantofi n cutiile numerotate de la 1 la n + 1. Printre cele n + 1
numere unul singur are valoarea 0 i corespunde cutiei goale. Linia a treia conine n +
1 numere separate prin cte un spaiu, reprezentnd configuraia final cerut, n care
valoarea 0 se afl pe poziia cruia i corespunde cutia goal.

Date de ieire
Fiierul de ieire CUTII.OUT va conine pe prima linie un numr ntreg k, reprezen-
tnd numrul minim de mutri.

Restricii i precizri
1 < n < 100.

Exemplu
CUTII.IN
4
3 4 1 0 2
4 0 2 1 3

CUTII.OUT
4
Explicaii
Mutarea 1: perechea 1 se mut din cutia 3 n cutia 4
Mutarea 2: perechea 2 se mut din cutia 5 n cutia 3
Mutarea 3: perechea 3 se mut din cutia 1 n cutia 5
Mutarea 4: perechea 4 se mut din cutia 2 n cutia 1

2.3.7. Subiruri
Se d un ir de n numere ntregi. S se descompun acest ir n numr minim de subi-
ruri strict cresctoare, astfel nct numerele lor de ordine (din irul dat) s fie ordonate
cresctor n subirurile formate.

Date de intrare
Prima linie a fiierului de intrare SUBSIR.IN conine numrul n, reprezentnd num-
rul de elemente din ir. Urmtoarea linie conine cele n numere ntregi, separate prin
cte un spaiu.

Date de ieire
Fiierul de ieire SUBSIR.OUT va conine pe prima linie un numr ntreg k, reprezen-
tnd numrul minim de subiruri care se pot forma. Pe urmtoarele k linii vor fi descri-
se subirurile cresctoare. Un subir va fi precizat prin numerele de ordine ale elemen-
telor din irul iniial, desprite prin cte un spaiu.
76 2. Metoda greedy

Restricii i precizri
1 n 10000;
elementele irului sunt numere cuprinse n intervalul [0, 40000].

Exemplu
SUBSIR.IN
10
2 3 1 6 8 3 7 9 5 7


SUBSIR.OUT
3
1 2 4 5 8
3 6 7
9 10
Explicaie
Se pot forma 3 subiruri cresctoare:
2, 3, 6, 8, 9
1, 3, 7
5, 7

2.3.8. Medici
O asociaie caritabil asigur consultaii medicale gratuite pentru cei fr posibiliti
materiale. Exist un singur cabinet dotat cu aparatur medical. Din acest motiv la un
moment dat un singur medic poate face consultaii. Asociaia apeleaz la n medici de
diverse specialiti, care i ofer benevol serviciile. Fiecare prezint un singur interval
[s
i
, f
i
] de-a lungul aceleiai zile, n care este disponibil. Ajutai asociaia s realizeze o
planificare a consultaiilor n cabinet, astfel nct numrul de medici s fie maxim.

Date de intrare
Prima linie a fiierului de intrare MEDICI.IN conine numrul n al medicilor. A doua
i a treia linie conin orele de nceput i respectiv orele de sfrit, corespunztoare ce-
lor n medici (numere ntregi). Numerele sunt separate prin cte un spaiu.

Date de ieire
Fiierul de ieire MEDICI.OUT va conine pe prima linie un numr k, reprezentnd
numrul maxim de medici care se pot selecta, astfel nct s fie ndeplinit condiia
din enun. A doua linie va conine k numere care vor reprezenta indicii medicilor se-
lectai.

Restricii i precizri
1 n 1000;
1 f
i
< s
i
1000, pentru i = 1, 2, ..., n.

Exemplu
MEDICI.IN
4
2 6 20 4
3 8 23 7
MEDICI.OUT
3
1 4 3



2. Metoda greedy 77

2.3.9. Turiti
O agenie de turism montan are n ghizi capabili s nsoeasc grupurile de turiti str-
ini n drumeii montane. Toate drumeiile care se organizeaz dureaz exact m zile. Un
ghid poate s nsoeasc ntr-o drumeie un singur grup, el fiind nedisponibil pentru
alte grupuri n acea perioad. La agenie se adun p solicitri nainte de nceperea se-
zonului. Fiecare din cele p grupuri solicitante specific data la care dorete s nceap
drumeia.
Ajutai directorul ageniei s aleag numrul maxim de grupuri care vor putea fi n-
soite de ghizi pe parcursul unui an ntreg. n plus, el a hotrt c dac exist solicitri
care au data de nceput d n timpul sezonului i s-ar putea desfura n totalitate doar
dac se depete ultima zi a sezonului, se prelungete sezonul cu zilele necesare.

Date de intrare
Prima linie a fiierului de intrare TURIST.IN conine numerele k, n, m i p, desprite
prin cte un spaiu (k reprezint numrul zilelor din sezon, n este numrul ghizilor, m
reprezint durata drumeiilor, iar p reprezint numrul solicitrilor.) Pe urmtoarea li-
nie sunt scrise datele d
i
(i = 1, 2, , p) pe care grupurile le-au scris pe solicitri.

Date de ieire
Fiierul de ieire TURIST.OUT conine un numr ntreg care reprezint numrul
maxim de solicitri rezolvate.

Restricii i precizri
1 n 100;
1 m 14;
1 p 1000;
1 k 365;
1 d
i
k (i = 1, 2, ..., p).

Exemplu
TURIST.IN
20 2 5 8
8 2 10 10 4 9 6 19
TURIST.OUT
5
Explicaii
Exemplul poate corespunde urmtoarei
situaii:
primul ghid rezolv solicitrile care
ncep n zilele 2, 8 i 19
al doilea ghid rezolv solicitrile care
ncep n zilele 4 i 9


78 2. Metoda greedy

2.4. Soluiile problemelor propuse

2.4.1. Meniuri
n aceast problem se cere stabilirea unui minim. Se tie c problemele de optim se
pot rezolva aplicnd metoda greedy, dac se poate arta c, pe baza alegerii optimului
local, metoda genereaz soluii optime. Deci, mai nti trebuie s demonstrm c acest
lucru este posibil.
n concluzie, tiind c t
k
1
t
k
2

..., t
k
n

sunt timpii necesari preparrii specialiti-
lor, presupunem c dac acestea se prepar n ordinea k
1
, k
2
, ..., k
n
, vom avea un timp
total de ateptare minim. Evident {k
1
, k
2
, ..., k
n
} = {1, 2, ..., n}.

Demonstraia o facem prin reducere la absurd. Presupunem c ordinea k
1
, k
2
, ..., k
n

nu asigur timpul total minim de ateptare. Din aceast presupunere temporar rezult
c exist o alt ordine de servire a clienilor (diferit de ordinea k
1
, k
2
, ..., k
n
), care con-
duce la un timp total de ateptare mai mic. Presupunem c o astfel de ordine difer de
ordinea k
1
, k
2
, ..., k
n
n poziiile i i j.

Conform ordinii k
1
, ..., k
i
, ..., k
j
, ..., k
n
avem timpul total de ateptare:
timptotal(k
1
, ..., k
i
, ..., k
j
, ..., k
n
) =
= nt
k
1

+ (n 1)t
k
2

+...+ (n i + 1)t
k
i

+...+ (n j + 1)t
k
j

+...+ t
k
n
.
Conform presupunerii de mai nainte, pentru ordinea k
1
, ..., k
j
, ..., k
i
, ..., k
n
avem
timpul total de ateptare:
timp
total
(k
1
, ..., k
j
, ..., k
i
, ..., k
n
) =
= nt
k
1

+ (n 1)t
k
2

+...+ (n i + 1)t
k
j

+...+ (n j + 1)t
k
i

+...+ t
k
n

care este mai mic dect
nt
k
1

+ (n 1)t
k
2

+...+ (n i + 1)t
k
i

+...+ (n j + 1)t
k
j

+...+ t
k
n

=
= timp
total
(k
1
, ..., k
i
, ..., k
j
, ..., k
n
).

Eliminnd termenii asemenea din partea stng, respectiv dreapt a operatorului
relaional avem:
nt
k
1

+ (n 1)t
k
2

+...+ (n i + 1)t
k
j

+...+ (n j + 1)t
k
i

+...+ t
k
n
<
nt
k
1

+ (n 1)t
k
2

+...+ (n i + 1)t
k
i

+...+ (n j + 1)t
k
j

+...+ t
k
n

(n i + 1)t
k
j

+ (n j + 1)t
k
i
< (n i + 1)t
k
i

+ (n j + 1)t
k
j


(n i + 1 n + j 1)t
k
j

< (n i+ 1 n + j 1)t
k
i


( j i )t
k
j

< ( j i )t
k
i



Deci, mprind aceast relaie cu j i (valoare pozitiv, deoarece am pornit cu pre-
supunerea c i < j), avem t
k
j

< t
k
i
, ceea ce nseamn c avem un timp de ateptare mai
mic, dup unul mai mare n irul ordonat cresctor a timpilor de ateptare, constatare
care evident este o contradicie cu ipotezele fixate.

2. Metoda greedy 79

Pentru a minimiza timpul mediu de ateptare (timp
mediu
) va trebui s minimizm
timpul total de ateptare (timp
total
) al persoanelor pentru a fi servite, deoarece timp
mediu

= timp
total
/n. O persoan va trebui s atepte prepararea meniului ei i a tuturor
persoanelor care vor fi servite n faa lui. Intuitiv, dac o persoan care dorete un me-
niu sofisticat este servit naintea uneia al crei meniu se prepar mai repede, timpul
total de ateptare al celor doi este mai mare dect dac servirea s-ar fi fcut invers. De
exemplu, pentru timpii 30 i 20, n prima situaie timp
total
= 30 + (30 + 20), iar n a
doua situaie timp
total
= 20 + (20 + 30).
n concluzie, vom alege persoanele n ordinea cresctoare a timpilor de preparare a
meniurilor, ceea ce necesit ca ele s fie ordonate cresctor n funcie de acest criteriu
i vom calcula timpul total de ateptare ca fiind suma timpilor de ateptare a fiecrei
persoane.
n situaia n care exist mai multe durate egale de preparare, nu conteaz ordinea
alegerii acestora.

2.4.2. Submulimi
n cazul n care mulimea dat conine doar elemente strict pozitive, submulimea va fi
format din toate acestea i evident, n acest caz se obine o sum maxim. Dac n
mulime avem i numere negative, atunci suma maxim se obine din mulimea forma-
t din elementele strict pozitive, deoarece dac am mai aduga un element y, valoarea
sumei s-ar micora (y este negativ) sau ar rmne egal cu cea calculat din elementele
pozitive (dac y = 0).
Dac n mulime nu exist nici un numr strict pozitiv, vom alege cel mai mare nu-
mr negativ i acesta va fi singurul element din submulimea cerut.
n cazul n care mulimea l conine pe 0 i are cel puin dou elemente, exist dou
soluii: una n care apare 0 i una n care 0 nu apare n submulime.

2.4.3. Maximizare
n maximizarea lui E vom aplica urmtoarele proprieti evidente:
Dac a, x, y sunt trei numere ntregi, unde a > 0, relaia a x > a y este adevrat
n cazul n care x > y.
Dac a, x, y sunt trei numere ntregi, unde a < 0, expresia a x > a y este adevrat
n cazul n care x < y.
Vom sorta mai nti cresctor elementele irurilor care memoreaz mulimile A i
B. Vom obine a
1
< a
2
<.< a
m
i b
1
< b
2
<< b
n
.
n ceea ce privete valorile elementelor din cele dou mulimi, putem avea trei situ-
aii:
a) Elementele din A sunt pozitive. n acest caz valoarea lui E este maxim, dac n-
mulim cel mai mare element din A (a
m
) cu cel mai mare element din B (b
n
), apoi
a
m-1
cu b
n-1
, a
m-2
cu b
n-2
etc.
80 2. Metoda greedy

b) Elementele din A sunt negative. n acest caz valoarea lui E este maxim, dac n-
mulim cel mai mic element din A (a
1
) cu cel mai mic element din B (b
1
), apoi a
2

cu b
2
, a
3
cu b
3
, ..., a
m
cu b
m
.
c) A are primele m
1
elemente numere negative i urmtoarele (m m
1
) elemente nu-
mere pozitive. n acest caz valoarea lui E este maxim dac nmulim primele m
1

elemente din A cu primele m
1
elemente din B, iar restul elementelor din A, n ordi-
ne, cu ultimele m m
1
elemente din mulimea B.

n scrierea programului, vom aplica direct punctul c). Dac A are m
1
elemente ne-
gative, vom selecta elementele corespunztoare lor din B, ncepnd cu b
1
. Vom alege
n continuare pentru elementele pozitive din A ultimele m m
1
elemente din B.

2.4.4. Staii
Fie mulimea ordonat a staiilor disponibile A = {1, 2, n}. Corespunztor acesteia
se cunosc cele n 1 distane dintre oricare dou staii alturate: a
1
, a
2
, , a
n-1
.
Problema revine la a determina o submulime B A cu numr maxim de elemente
(staii), B = {i
1
, i
2
, , i
k
} n care s se pstreze ordinea din A i s avem ndeplinit
proprietatea a
i
j+1
a
i
j
x, pentru orice j = 1, 2, , k 1.


Subalgoritm Selecie_Greedy(A,B):
B {1}
dist_ultim 0
pentru j=2,n execut:
dac a
j-1
+ dist_ultim x atunci
B B {j}
dist_ultim 0
altfel
dist_ultim dist_ultim + a
j-1
sfrit dac
sfrit pentru
sfrit subalgoritm

Algoritmul ncepe cu selectarea staiei 1. n continuare se parcurge irul staiilor,
cutnd prima staie suficient de ndeprtat de 1. Aceasta se adaug la soluie. Algo-
ritmul se repet n acest fel pn cnd s-au verificat toate staiile. n scrierea algorit-
mului s-a folosit variabila dist_ultim pentru calcularea distanei dintre dou staii.

Demonstraie
Mai nti vom demonstra proprietatea: Exist ntotdeauna o soluie optim a pro-
blemei care conine staia avnd numrul 1.
2. Metoda greedy 81

Vom nota cu dist(i, j) distana dintre staiile i i j. Fie B A o soluie optim a pro-
blemei, unde B = {j
1
, j
2
,, j
k
} nu conine elementul 1, corespunztor primei staii.
Atunci dist(j
1
, j
2
) x. Dar cum staia 1 precede staia j
1
, avem relaia: dist(1, j
2
) =
dist(1, j
1
) + dist(j
1
, j
2
). Deci dist(1, j
2
) x. Prin urmare i mulimea B' = {1, j
2
,, j
k
}
verific condiiile problemei i are numrul de elemente egal cu cel al mulimii B. n
aceste condiii i B' este o soluie optim.
Am demonstrat c exist o soluie optim a problemei care conine staia cu num-
rul 1. n continuare vor putea fi selectate n construirea soluiei optime doar acele staii
care, fa de staia 1, se situeaz la o distan cel puin egal cu x.
Dac B este o soluie optim pentru mulimea A, vom arta c B'' = B {1} con-
struit cu subalgoritmul Selecie_Greedy este o soluie optim pentru A' = A {j |
dist(1, j) < x}. Presupunem c B'' nu este soluie optim. Deci, exist B''', astfel nct
|B'''| > |B''|. Dar atunci mulimea {1} B''' are cardinalul |{1} B'''| > |B|, ceea ce re-
prezint o contradicie cu presupunerea c B este soluie optim. Aadar mulimea B'',
construit cu subalgoritmul Selecie_Greedy are numr maxim de elemente. Prin
urmare i mulimea B = {1} B'' va avea numr maxim de elemente i deci va fi o so-
luie a problemei date.

2.4.5. Rucsac
Problema este cunoscut n literatura de specialitate sub denumirea de problema frac-
ionar a rucsacului.
S lum pentru nceput un exemplu concret. n magazin exist 4 obiecte i capaci-
tatea rucsacului este G = 10.
Numr obiect 1 2 3 4
Greutate 5 4 5 2
Valoare 10 20 1 3

Vom calcula, pentru fiecare obiect, valoarea pe unitatea de greutate.

Valoare/greutate 2 5 0.2 1.5

Vom alege pe rnd obiectele n ordine descresctoare a acestei valori pn la um-
plerea rucsacului.
Pasul 1. Se alege obiectul 2 (are raportul valoare/greutate maxim). Se calculeaz
G_parial = 4 i Ctig_parial = 20.
Pasul 2. Se alege obiectul 1 (are raportul valoare/greutate maxim ntre obiectele neale-
se). Se calculeaz G_parial = 4 + 5 i Ctig_parial = 20 + 5.
Pasul 3. Se alege obiectul 4, care se taie. Este necesar doar n cantitatea 1, deci c-
tigul n urma alegerii lui va fi de 1.5, G_parial = 10 i Ctig_parial =
26,5.
Ctigul final este 26.5.
82 2. Metoda greedy

Deoarece se pot lua obiecte tiate, se obine o ncrcare optim a rucsacului, la fie-
care pas lundu-se obiectul cel mai valoros.

n algoritm se calculeaz pentru fiecare obiect raportul valoare/greutate i se ordo-
neaz descresctor elementele irului n funcie de acesta. Se extrag obiecte din irul
ordonat pn cnd acestea vor umple rucsacul sau pn se vor epuiza. n situaia n ca-
re s-a ajuns la un obiect cu o greutate prea mare, acesta se taie.
n algoritmul de mai jos nr_alese contorizeaz numrul obiectelor alese de ho, y
este un ir de indici, reprezentnd numerele de ordine ale obiectelor alese, iar Ctig
este variabila care reine rezultatul final, reprezentnd ctigul total realizat de ho. n
momentul apelrii subalgoritmului Alege, irul x este deja ordonat descresctor n
funcie de raportul valoare/greutate.

Subalgoritm Alege(nr_alese,y,Ctig):
i 1 { primul obiect }
G_parial 0 { deocamdat greutatea mpachetat este 0 }
sfrit fals { nc nu s-a mpachetat rucsacul }
ct timp (G_parial < G) i (i n) i nu sfrit execut:
nr_alese nr_alese + 1 { se selecteaz un obiect }
y[nr_alese] x[i].nr
{ n irul soluiei se pstreaz numrul de ordine al obiectului }
dac x[i].gr G - G_parial atunci { poate mai ncape ceva... }
G_parial G_parial + x[i].gr
Ctig_parial Ctig_parial + x[i].v
altfel { ultimul obiect se taie dac este cazul }
Ctig Ctig_parial + (G-G_parial) * x[i].gv
{ nu mai ncape nimic, intrerupem reluarea while-ului }
sfrit adevrat
sfrit dac
i i + 1
sfrit ct timp
sfrit subalgoritm

Observaii
Pentru anumite date de intrare problema admite mai multe soluii. Pot exista obiec-
te care conduc la acelai ctig. n acest caz ele se selecteaz n ordinea n care apar
n irul ordonat. Afiarea tuturor variantelor de selectare a obiectelor se poate face
folosind metoda backtracking.
Pot exista situaii n care se aleg toate obiectele, dar nu se completeaz capacitatea
rucsacului. La scrierea algoritmului trebuie s inem cont i de acest caz.

2. Metoda greedy 83

2.4.6. Cutii
Fie mai nti exemplul din enun. Avem 4 perechi de pantofi i 5 cutii n care acestea
sunt aranjate n felul urmtor:
3 4 1 0 2
Se cunoate i aranjarea dorit:
4 0 2 1 3
Adic, iniial, n prima cutie se gsete perechea 3, dar acolo trebuie s fie perechea
4, n a doua cutie se gsete perechea 4, dar a doua cutie trebuie s fie goal etc.
Un ir posibil de mutri (dar care nu conduce la soluia optim) ar fi:
Mutarea 1: perechea 3 se mut din cutia 1 n cutia 4;
Mutarea 2: perechea 4 se mut din cutia 2 n cutia 1;
Mutarea 3: perechea 1 se mut din cutia 3 n cutia 2;
Mutarea 4: perechea 2 se mut din cutia 5 n cutia 3;
Mutarea 5: perechea 3 se mut din cutia 4 n cutia 5;
Mutarea 6: perechea 1 se mut din cutia 2 n cutia 4.
Am aranjat pantofii n 6 mutri.

Dar putem proceda n felul urmtor:
Mutarea 1: perechea 1 se mut din cutia 3 n cutia 4 (a ajuns unde trebuie, acum cutia
3 este goal);
Mutarea 2: perechea 2 se mut din cutia 5 n cutia 3 (a ajuns unde trebuie, acum cutia
5 este goal);
Mutarea 3: perechea 3 se mut din cutia 1 n cutia 5 (a ajuns unde trebuie, acum cutia
1 este goal);
Mutarea 4: perechea 4 se mut din cutia 2 n cutia 1 (a ajuns unde trebuie, acum cutia
2 este goal, aa cum cere configuraia dorit).
Astfel am aranjat pantofii n 4 mutri.

Analiznd exemplul, ajungem la concluzia c pentru a aranja pantofii n cutii, tre-
buie s mutm fiecare pereche p de pantofi la locul ei (dac nu este acolo). Exist dou
cazuri posibile:
A. Cutia n care trebuie pus perechea p este goal;
B. Cutia perechii p este ocupat de alt pereche q.

n cazul A vom muta perechea p la locul ei, n cutia goal, fr a mai face alte mu-
tri. n cazul B trebuie eliberat mai nti cutia ocupat de q i doar pe urm vom pu-
tea muta perechea p n cutia ei, acum eliberat.
Situaia A este de preferat, deoarece n acest caz o pereche ajunge la locul ei printr-o
singur mutare. n situaia B sunt necesare dou mutri pentru a duce o pereche de
pantofi unde trebuie. Din acest motiv vom identifica n rezolvarea problemei cazul A
ct timp este posibil i o vom rezolva. n celelalte cazuri (similare situaiei B) vom
aranja cte o pereche n cutia potrivit prin dou mutri, conform explicaiilor date.
84 2. Metoda greedy

n irurile ci i cf se memoreaz configuraiile iniial i final a perechilor de
pantofi n cutii. n variabilele cigol i cfgol se memoreaz indicele cutiei goale n
configuraia iniial i respectiv final.

Subalgoritm Numr_mutri(n,ci,cf):
repet
schimb fals { nc nu am schimbat nimic }
ct timp cigol cfgol execut: { rezolvm situaia A }
ci[cigol] cf[cigol] { mutm n cutia goal perechea potrivit }
cigol Caut(cf[cigol])
ci[cigol] 0 { se elibereaz o nou cutie }
mutri mutri + 1 { am fcut doar o mutare }
schimb adevrat { am efectuat o schimbare }
sfrit ct timp
{ se caut o cutie nearanjat }
ct timp (ci[i] = cf[i]) i (i n+1) execut:
i i + 1
sfrit ct timp
dac i n atunci { rezolvm situaia B }
{ golim cutia nearanjat i aducem perechea potrivit }
ci[cigol] ci[i]
ci[i] cf[i]
cigol Caut(ci[i])
i i + 1
mutri mutri + 2 { am fcut dou mutri }
schimb adevrat { am efectuat o schimbare }
sfrit ct timp
pn cnd nu schimb { pn cnd nu a mai fost necesar nici o schimbare }
sfrit subalgoritm

Observaii
1. n algoritm s-a folosit funcia Caut(p) care returneaz numrul cutiei care coni-
ne perechea p.
2. Situaia A apare dac indicele cutiei goale n configuraia iniial este diferit de in-
dicele cutiei goale n configuraia final.

2.4.7. Subiruri
Subirurile se construiesc simultan, printr-o singur parcurgere a irului dat. Pentru fi-
ecare element x
i
din ir se caut un subir existent la care acesta se poate aduga la
sfrit. Dac nu se gsete un astfel de subir, vom crea unul nou n care x
i
se va intro-
duce ca prim element.
2. Metoda greedy 85

Dac vom gsi mai multe subiruri n care s-ar putea aduga x
i
, l vom alege pe cel
pentru care valoarea ultimului element este maxim.

Exemplu
Fie n = 8 i irul de numere 9, 3, 10, 1, 11, 5, 12, 8

Pasul Observaii ir 1 ir 2 ir 3
1. 9 va fi primul element din primul ir 9 - -
2. 3 va fi primul element din al doilea ir 9 3 -
3. (*) 10 se adaug la sfritul irului 1 9, 10 3 -
4. 1 va fi primul element din irul 3 9, 10 3 1
5. (*) 11 se adaug la sfritul irului 1 9, 10, 11 3 1
6. (*) 5 se adaug la sfritul irului 2 9, 10, 11 3, 5 1
7. (*) 12 se adaug la sfritul irului 1 9,10,11, 12 3, 5 1
8. (*) 8 se adaug la sfritul irului 2 9,10,11, 12 3, 5, 8 1

Observaii
1. La paii marcai cu (*) au existat mai multe posibiliti de alegere a irului la care
s se adauge elementul curent.
2. Se observ c prin acest mod de construire a subirurilor, elementele maxime din
fiecare subir (cele care s-au adugat ultima oar) formeaz la rndul lor un ir des-
cresctor (la pasul 4: 10, 3, 1, dar i la pasul 8: 12, 8, 1). Dac nu ar fi aa, ar n-
semna c la un moment dat nu am ales n mod corect subirul n care se adaug un
element. De exemplu, n tabelul de mai sus, elementul 10 nu poate fi pus dup 3,
deoarece el trebuie nghesuit (conform cerinelor problemei) lng 9. Din acest
motiv, vom cuta cel mai potrivit subir pentru un element cu algoritmul de cutare
binar n irul vrfurilor fiecrui subir construit pn la momentul respectiv.
Astfel vom gsi mai rapid subirul potrivit pentru elementul curent.

n urmtorul algoritm folosim notaiile:
n: numrul elementelor n irul dat;
x: irul dat;
nrs: numrul subirurilor cresctoare;
s: s[i] =numrul de ordine al subirului din care face parte x[i];
nrs: numrul subirurilor cresctoare;
vf: valorile elementelor maxime din fiecare subir.

Subalgoritm ConstruieteSubiruri(n,nrs,x,s,vf):
nrs 1
s[nrs] 1 { x[1] face parte din subirul 1 }
86 2. Metoda greedy

vf[nrs] x[1]
pentru j=2,n execut: { se caut subirul potrivit pentru x[j] }
k Caut(vf,1,nrs,x[j]) { se apeleaz algoritmul de cutare binar }
{ care va returna numrul de ordine al subirului unde ar trebui s se afle x[j] }
{ sau 0 dac un astfel de subir nu s-a gsit }
dac k = 0 atunci { dac nu am gsit un subir potrivit }
nrs nrs + 1 { x[j] va forma un nou subir }
s[j] nrs { numrul de ordine al subirului }
vf[nrs] x[j] { valoarea elementului maxim din subirul nrs }
altfel { x[j] se va aduga unui subir existent }
s[j] k { numrul de ordine al subirului }
vf[k] x[j] { valoarea elementului maxim din subirul k }
sfrit dac
sfrit pentru
sfrit subalgoritm

Chiar dac algoritmul cutrii binare se cunoate, prezentm modul n care se apli-
c n rezolvarea acestei probleme, deoarece stabilirea numrului de ordine al subiru-
lui n care se va aduga elementul curent din irul dat se realizeaz n cadrul acestui
subalgoritm. Presupunem c n parametrul ce s-a transmis valoarea elementului x[j]
curent. Variabila gsit o folosim n scopul de a reine faptul c s-a gsit sau nu ce n
irul vrfurilor.

Subalgoritm Caut(vf,s,d,ce):
gsit fals
ct timp (s d) i nu gsit execut:
m (s+d) div 2
dac vf[m] = ce atunci
gsit adevrat
altfel
dac vf[m] > ce atunci
s m + 1
altfel
d m 1
sfrit dac
sfrit dac
sfrit ct timp
dac gsit atunci { dac l-am gsit pe x[j] n captul unui subir }
{ avansm n irul vrfurilor }
ct timp (ce = vf[m]) i (m nrs) execut:
m m + 1 { ct timp se succede aceeai valoare }
sfrit ct timp
2. Metoda greedy 87

dac m nrs atunci { dac ne-am oprit dup vrful unui ir existent }
Caut m { aici se va aduga x[j] }
altfel
{ dac i ultimul ir l are n vrf pe x[j], trebuie s crem un subir nou }
Caut 0
sfrit dac
sfrit dac
dac nu gsit atunci { dac nu l-am gsit pe x[j] }
dac (s nrs) i (vf[s] < ce) atunci
{ acolo unde a euat cutarea, irul vf }
Caut s { conine o valoare mai mic, am gsit locul lui x[j] }
altfel
Caut 0 { n caz contrar trebuie s crem un subir nou }
sfrit dac
sfrit dac
sfrit subalgoritm

2.4.8. Medici
Fie mulimea medicilor M = {1,2,, n}. Corespunztor acesteia se cunosc cele n in-
tervale care memoreaz orarele medicilor: [s
1
, f
1
], [s
2
, f
2
], , [s
n
, f
n
].
Dac un medic i este selectat, cabinetul va fi ocupat n intervalul de timp [s
i
, f
i
].

Vom spune c doi medici i i j au orarele compatibile dac [s
i
, f
i
] [s
j
, f
j
] = . Pro-
blema revine la a determina o submulime maxim S M de medici cu orare compati-
bile dou cte dou.
Schimbm ordinea medicilor, obinnd M = {i
1
, i
2
, , i
n
},

astfel nct f
i
1
f
i
2
f
i
n

(medicii apar n M ordonai dup captul din dreapta al intervalului de timp n care ei
pot consulta). Evident {i
1
, i
2
, , i
n
} este o permutare a mulimii {1, 2, , n}.
Selectarea o vom realiza cu algoritmul Selecie-Greedy:

Subalgoritm Selecie-Greedy(Sel,s,f):
Sel {i
1
} { selectarea primului medic (i
1
) }
ultim i
1
{ acesta este i ultimul printre cei selectai }
pentru k=2,n execut:
{ cutarea urmtorului medic din M care are orarul compatibil cu el }
dac s
i
k

> f
ultim
atunci
Sel Sel {i
k
} { cel compatibil se adaug soluiei }
ultim i
k
{ acum cel adugat este ultimul }
sfrit dac
sfrit pentru
sfrit subalgoritm
88 2. Metoda greedy

Demonstraie
Considerm c am ordonat mulimea medicilor dup timpul final al fiecrui medic:
M = {i
1
, i
2
, , i
n
} i prin urmare f
i
1
f
i
2
f
i
3
f
i
n
. (1)
Deci primul medic din M (cel cu indice i
1
) va avea valoarea f
i
1
minim dintre toate
valorile f
i
k
, k = 1, 2, , n. Vom demonstra mai nti urmtoarea propoziie:
Exist ntotdeauna o soluie optim a problemei care l conine pe i
1
.
Fie A M o soluie optim a problemei, unde A = {j
1
, j
2
, , j
k
}. Presupunem c
aceast mulime nu l conine pe i
1
. Atunci are loc relaia: f
j
1
< s
i
2
. (2)
Fie A' = {i
1
, j
2
,, j
k
}. Din (1) i (2) rezult c f
i
1
< s
i
2
, deci medicul i
1
va avea ora-
rul compatibil cu medicii j
2
, j
3
, , j
k
. Deci toi medicii din A' au orare compatibile re-
ciproc. Cum |A'| = |A|, rezult c i A' este o soluie optim a problemei.
Am demonstrat deci c exist o soluie optim a problemei care conine medicul i
1
.
n continuare vor putea fi selectai n soluia optim doar acei medici care au orarele
compatibile cu i
1
.
Dac A este o soluie optim pentru M, vom arta c A'' = A {i
1
} construit cu al-
goritmul Selecie-Greedy este o soluie optim pentru M' = M {j | s
j
f
i
1
}.
Presupunem c A'' nu e soluie optim. Deci exist o soluie B, astfel nct |B| > |A''|.
Dar atunci | B {i
1
}| > |A|. Am ajuns la contradicie cu presupunerea iniial c A este
soluie optim.
Programul presupune citirea datelor din fiier, sortarea acestora i parcurgerea iru-
lui pentru construirea mulimii A, deci complexitatea este O(n) + O(n lg n) = O(n lg n).

2.4.9. Turiti
Dac agenia dispune de un singur ghid, trebuie s i repartizm ct mai multe solici-
tri, fr suprapunerea perioadelor. Exist deci p intervale de forma [s
i
, s
i
+ m], s
i
fiind
data nceperii drumeiei scris pe solicitarea i. Dintre acestea trebuie ales un numr
maxim de intervale care s nu se suprapun. Regsim n acest caz datele problemei an-
terioare, uor simplificat. Cum toate drumeiile se execut n acelai numr de zile,
vom putea alege solicitrile n funcie de data iniial s
i
, respectnd algoritmul proble-
mei anterioare.
Pe caz general vom memora n tabloul x
i
numrul de cereri existente cu ziua de n-
ceput i. Numrul de elemente ale tabloului este egal cu numrul de zile ale sezonului.
n subalgoritmul Rezolv_ziua ncercm s gsim ghizi pentru toate drumeiile care
ncep n ziua i. Pentru a gsi un ghid disponibil, vom traversa irul zi_liber n care
componenta a i-a conine prima zi n care ghidul i este disponibil.

Subalgoritm Rezolv_ziua(i):
ct timp x[i] > 0 execut
primul_ghid_disponibil Caut_ghid(i)
2. Metoda greedy 89

dac primul_ghid_disponibil > n atunci
ieire forat din ct timp { nu se poate rezolva cererea }
altfel
zi_liber[primul_ghid_disponibil] i + m
{ prima zi liber a ghidului gsit disponibil va fi cu m mai mare }
rezolvate rezolvate + 1 { nc un grup rezolvat }
x[i] x[i] 1 { scade numrul solicitrilor care ncep n ziua i }
sfrit dac
sfrit ct timp
sfrit subalgoritm

Cutarea ghidului disponibil se realizeaz cu subalgoritmul Caut_ghid:

Subalgoritm Caut_ghid(d):
{ caut primul ghid disponibil ncepnd cu data d i dac nu gsete, ntoarce n + 1}
i 1
ct timp (i n) i (zi_liber[i] > d) execut:
i i + 1
sfrit cttimp
Caut_ghid i
sfrit subalgoritm

S-ar putea să vă placă și