Preskoči na glavni sadržaj

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 xx, koja predstavlja ukupnu količinu novca koju treba razmijeniti. U sljedećem retku dan je broj kk, broj različitih novčanica koje su nam dostupne. U trećem retku dano je kk brojeva, a1,a2,...,ana_1, a_2, ..., a_n - novčanice koje su nam dostupne.

Svake novčanice dostupno je beskonačno mnogo. Barem jedna od novčanica ima vrijednost 11, 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 {1,2,5,10}\{1,2,5,10\}. 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 xx dobili bi sljedeće postupke:

XXPostupakKoličina novčanica
85,2,13
1710,5,23
1110,12

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 {1,3,4,5}\{1,3,4,5\}:

XXPostupakKoličina novčanica
85,32
75,1,13

Pozorni čitatelj primjetit će da slučaj sa x=7x=7 možemo razložiti bolje nego što je to učinio pohlepni pristup - 7=4+37 = 4 + 3. 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 xx ogroman (u odnosu na najveću novčanicu MM), tu novčanicu trebamo iskorištavati mnogo puta (dok se iznos ne smanji). Pokušajmo odrediti što točno znači ogroman.

Neka je MM najveća novčanica iz skupa SS. Dokazat ćemo da (ovaj, od sad implicitno) pohlepni algoritam daje optimalno rješenje za sve xx, pod uvjetom da daje optimalno rješenje za sve x2M1x \leq 2 \cdot M - 1. 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.

  1. Baza indukcije:
  • pohlepni algoritam daje optimalno rješenje za sve x2M1x \leq 2 \cdot M -1.
  1. Korak indukcije:
  • dokažimo da optimalnost pohlepnog algoritma za sve xnx \leq n povlači optimalnost algoritma za sve xn+1x \leq n+1. Za x2M1x \leq 2 \cdot M-1 tvrdnja vrijedi iz pretpostavke. Za x=n+1x = n+1 pretpostavimo suprotno, tj. da pohlepni algoritam nije optimalan. Imamo dva slučaja:
    • a) optimalno rješenje u sebi ima novčanicu MM. Ako je to istina, onda smo taj MM mogli uzeti odmah (što bi napravio i pohlepni algoritam), a onda bi nam optimalnost za xnx \leq n 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 MM. Ako je to istina, onda će se zamjena eventualno svesti na vraćanje yy novca, My2M1M \leq y \leq 2 \cdot M -1 (jer ne možemo preskočiti taj raspon veličine MM). Budući da je u tom intervalu pohlepni algoritam optimalan, on će sigurno uzeti i novčanicu MM (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 x2M1x \leq 2 \cdot M - 1 implicira globalnu optimalnost pohlepnog algoritma.

Drugim riječima, dovoljno je provjeriti je li pohlepni algoritam ispravan samo za konačno mnogo vrijedosti xx. Ipak, kako ovo provjeriti naučit ćemo tek na predavanju vezanom za dinamičko programiranje.