Wróć do: Algorytmy
średni zachłannygreedymatura rozszerzona z informatyki

Wydawanie reszty (zachłanny)

Zachłanny algorytm wydawania reszty – zawsze wybiera największy dostępny nominał.

01

Opis

Problem wydawania reszty polega na znalezieniu minimalnej liczby monet potrzebnych do wydania określonej kwoty przy użyciu dostępnych nominałów.

Algorytm zachłanny w każdym kroku wybiera największy nominał, który nie przekracza pozostałej kwoty do wydania. Jest szybki i prosty, ale nie zawsze daje optymalne rozwiązanie.

Działa optymalnie dla standardowych systemów monetarnych, takich jak polski (1, 2, 5, 10, 20, 50, 100, 200, 500) – to nie jest przypadek, system został tak zaprojektowany.

Kontrprzykład: dla nominałów [3, 4] i kwoty 6 algorytm zachłanny wybiera najpierw 4, potem nie może wydać reszty 2. Tymczasem optymalne rozwiązanie to 3 + 3. W takich przypadkach trzeba użyć algorytmu dynamicznego.

Na maturze: zadania zazwyczaj używają polskich nominałów, więc algorytm zachłanny wystarcza.

02

Pseudokod

funkcja wydaj_zachlannie(nominaly, kwota):
  // sortujemy nominały malejąco
  posortuj nominaly malejąco
  monety  pusta lista
  dla każdej monety w nominaly:
    dopóki kwota  moneta:
      dodaj moneta do monety
      kwota  kwota - moneta
  jeżeli kwota > 0:
    // nie da się wydać reszty
    zwróć "brak rozwiązania"
  zwróć monety
03

Implementacja w Pythonie

def wydaj_zachlannie(nominaly, kwota):
    nominaly = sorted(nominaly, reverse=True)
    monety = []
    for moneta in nominaly:
        while kwota >= moneta:
            monety.append(moneta)
            kwota -= moneta
    if kwota > 0:
        return None
    return monety

# Przykład użycia
nominaly_pl = [1, 2, 5, 10, 20, 50, 100, 200, 500]
print(wydaj_zachlannie(nominaly_pl, 437))
# Wynik: [200, 200, 20, 10, 5, 2]

# Kontrprzykład - tu algorytm zawiedzie
print(wydaj_zachlannie([3, 4], 6))
# Wynik: None

Złożoność obliczeniowa

CzasowaO(n + k)
PamięciowaO(k)

Powiązane zagadnienia