Pohlepni pristupi
Pohlepni pristupi predstavljaju skup algoritamskih postupaka u kojima se potpuno rješenje problema komponira poduzimajući korake koji se u djelomičnom rješenju čine lokalno najboljima.
Problem 3: Problem razmjene novca (coin change problem)
Zadana je cjelobrojna vrijednost , koja predstavlja ukupnu količinu novca koju treba razmijeniti. U sljedećem retku dan je broj , broj različitih novčanica koje su nam dostupne. U trećem retku dano je brojeva, - novčanice koje su nam dostupne.
Svake novčanice dostupno je beskonačno mnogo. Barem jedna od novčanica ima vrijednost , tako da je moguće razmijeniti bilo koji iznos.
Cilj je razmijeniti iznos koristeći najmanji broj novčanica. Novčanice koje uzmemo više puta broje se toliko puta.
Pohlepni pristup
Neka je skup novčanica jednak . Pohlepni pristup koji nama pada napamet pretpostavlja da uzmemo najveću novčanicu koju imamo, sve što možemo vratimo pomoću nje, a zatim krenemo na manje.
Za različite količine dobili bi sljedeće postupke:
Postupak | Količina novčanica | |
---|---|---|
8 | 5,2,1 | 3 |
17 | 10,5,2 | 3 |
11 | 10,1 | 2 |
Za ovaj početni skup novčanica (kao i za hrvatski sustav novčanica) vrijedi da pohlepni pristup daje optimalno rješenje. Prije nego krenemo na dokaz, pogledajmo rješenja koja daje ovaj pohlepni pristup za skup :
Postupak | Količina novčanica | |
---|---|---|
8 | 5,3 | 2 |
7 | 5,1,1 | 3 |
Pozorni čitatelj primjetit će da slučaj sa možemo razložiti bolje nego što je to učinio pohlepni pristup - . Dakle, pohlepni pristup nije optimalan za sve skupove novčanica.
Zbog ovog neočekivanog problema bitno je naučiti dokazivati optimalnost različitih pohlepnih pristupa. Iako na natjecanjima često preskačemo formalne dokaze, gotovo uvijek neke od njihovih dijelova intuitivno shvatimo prilikom rješavanja. Ovim dokazima pokušat ćemo čitatelju približiti taj proces zaključivanja.
Optimalnost pohlepnog pristupa nakon određenog iznosa
Intuitivno, jasno je da kad je ogroman (u odnosu na najveću novčanicu ), tu novčanicu trebamo iskorištavati mnogo puta (dok se iznos ne smanji). Pokušajmo odrediti što točno znači ogroman.
Neka je najveća novčanica iz skupa . Dokazat ćemo da (ovaj, od sad implicitno) pohlepni algoritam daje optimalno rješenje za sve , pod uvjetom da daje optimalno rješenje za sve . Primijetimo da je poredak razmjene novčanica nebitan, pa se možemo fokusirati na one poretke u kojima prvo vraćamo veće novčanice.
- Baza indukcije:
- pohlepni algoritam daje optimalno rješenje za sve .
- Korak indukcije:
- dokažimo da optimalnost pohlepnog algoritma za sve povlači optimalnost algoritma
za sve . Za tvrdnja vrijedi iz pretpostavke.
Za pretpostavimo suprotno, tj. da pohlepni algoritam nije optimalan.
Imamo dva slučaja:
- a) optimalno rješenje u sebi ima novčanicu . Ako je to istina, onda smo taj mogli uzeti odmah (što bi napravio i pohlepni algoritam), a onda bi nam optimalnost za tvrdila da i dalje slijedimo pohlepni algoritam. U ovom slučaju je pohlepni algoritam optimalan - kontradikcija.
- b) optimalno rješenje u sebi nema novčanicu . Ako je to istina, onda će se zamjena eventualno svesti na vraćanje novca, (jer ne možemo preskočiti taj raspon veličine ). Budući da je u tom intervalu pohlepni algoritam optimalan, on će sigurno uzeti i novčanicu (po definiciji pohlepnog algoritma) - kontadikcija s tim da takve novčanice u rješenju uopće nema.
- U svakom slučaju dobivamo kontradikciju - pohlepni algoritam ipak jest optimalan.
Induktivnim zaključivanjem dokazali smo da optimalnost pohlepnog algoritma za sve vrijednost implicira globalnu optimalnost pohlepnog algoritma.
Drugim riječima, dovoljno je provjeriti je li pohlepni algoritam ispravan samo za konačno mnogo vrijedosti . Ipak, kako ovo provjeriti naučit ćemo tek na predavanju vezanom za dinamičko programiranje.