C++ algorytmy zachłanne

Algorytm zachłanny charakteryzuje się tym, że w celu wyznaczenia rozwiązania w każdym kroku dokonuje zachłannego, tj. najlepszego w danym momencie wyboru, wyboru rozwiązania podproblemu.

Algorytm omówię na przykładzie wydawania reszty przez automaty oraz wypłat gotówki z bankomatów.

Wydawanie reszty
Problem:
Jak dostępnymi monetami wydać resztę w taki sposób, by użyć ich jak najmniej.
Jakie będzie rozwiązanie dla reszty 6, a jakie dla 13?

1zl 2zl 5zl

RESZTA 6 RESZTA 13
1zl 1zl 1zl 1zl 1zl 1zl
6 monet
2zl 1zl 1zl 1zl 1zl
5 monet
2zl 2zl 2zl
3 monety
5zl 1zl
2 monety
1zl 1zl 1zl 1zl 1zl 1zl 1zl 1zl 1zl 1zl 1zl 1zl 1zl
13 monet
2zl 2zl 2zl 2zl 2zl 2zl 1zl
7 monet
5zl 2zl 2zl 2zl 2zl
5 monet
5zl 5zl 2zl 1zl
4 monety

Widać zatem, że powinniśmy rozpocząć wydawanie reszty od najwyższych nominałów.
Algorytm przedstawia się następująco:

  • pobieramy kwotę do zwrotu
  • zerujemy licznik monet ile=0
  • dopóki kwota >= 5 zmniejszamy kwotę o 5 i zwiększamy licznik
  • powtarzamy operację dla nominału 2zł oraz 1 zł
  • wyświetlamy wynik

Realizacja: reszta 1

Stosując dzielenie całkowite oraz resztę z dzielenia możemy funkcję zapisać krócej: reszta 2

wiele nominałów

Zakładamy, że mamy większą ilość nominałów do wydawania.
Definiowanie działania dla każdej oddzielnie jest nieoptymalne.
W tym przypadku zastosujemy tablicę zawierającą nominały, którymi dysponujemy.

Deklaracja tablicy: int nominaly[n] = {n1, n2, ... nn};

Procedura przyjmuje postać: reszta 2

zadania

  1. Napisz procedurę bankomat(kwota).
    Bankomat wydaje jedynie banknoty (10, 20, 50, 100, 200, 500).
    W wyniku otrzymujem ilość banknotów poszczególnych nominałów.
    UWAGA: Jeśli dany nominał nie jest wypłacany, nie pokazuje się w wynikach!

Projekt i wykonanie: Ryszard Rogacz© 1999−2024