Implementacja
Implementacja algorytmu wydawania reszty w języku C++
Zaimplementujemy funkcję zachlanneWydawanieReszty(), która dla zadanej reszty resztaDoWydania zwróci liczbę monet lub banknotów z n elementowej tablicy nominaly potrzebnych do jej wydania. Każdego nominału z tablicy nominaly możemy użyć dowolną liczbę razy.
Wykorzystamy uproszczony polski system monetarnysystem monetarny.
Specyfikacja:
Dane:
resztaDoWydania– liczba naturalna; wartość reszty do wydanian– liczba naturalna; liczba dostępnych nominałównominaly– tablica liczb naturalnych; tablica dostępnych nominałów posortowana malejąco
Wynik:
komunikat dotyczący wykorzystanych nominałów
Przykładowy komunikat:
W kodzie źródłowym języka C++ przedstawiono przykładową implementację algorytmu zachłannegoalgorytmu zachłannego, który może zostać wykorzystany do rozwiązania problemu. Funkcja zachlanneWydawanieReszty() przyjmuje trzy parametry:
resztaDoWydania– wartość reszty do wydania,nominaly– tablica dostępnych nominałów posortowana malejąco,n– rozmiar tablicy, czyli po prostu liczba dostępnych nominałów.
Zmienna k wewnątrz pętli for przechowuje maksymalną liczbę powtórzeń nominału nominaly[i], przy pozostałej kwocie do wydania resztaDoWydania. Wartość resztaDoWydania jest zmniejszana o maksymalną wartość, którą można wydać danym nominałem. Algorytm zwraca liczbę monet lub banknotów użytych do wydania reszty o początkowej wartości resztaDoWydania.
Przyjrzyjmy się innej implementacji funkcji zachlanneWydawanieReszty(), która w celu określenia liczby nominałów, potrzebnej do wydania reszty resztaDoWydania, używa operacji dzielenia modulo. Możemy podzielić resztę resztaDoWydania przez nominał nominaly[i], a następnie wynik dzielenia zaokrąglić w dół, do całkowitej części liczby. Dzięki temu dowiemy się, ile sztuk danego nominału algorytm użyje do wydania reszty. Operacja resztaDoWydania % nominaly[i] zwróci informację o tym, jaka kwota pozostała do wydania.
Nie możemy zapomnieć o przypadku, w którym reszta będzie liczbą zmiennoprzecinkową. W Polsce do wydawania reszty po przecinku używamy nominałów 50 gr, 20 gr, 10 gr, 5 gr, 2 gr, 1 gr. W przypadku języka C++, podczas wydawania reszty, należy pamiętać o niedokładnościach w reprezentacji liczb zmiennoprzecinkowych. Operacje na takich liczbach powodują pewne niedokładności. Dlatego, aby nasze obliczenia były precyzyjne, najłatwiej jest zamienić wszystkie nominały na grosze. W takiej sytuacji resztę 19,99 zł zamienimy na 1999 gr, co pozwoli na łatwe i dokładne określenie minimalnej liczby monet lub banknotów potrzebnych do wydania reszty.
Słownik
algorytm dokonujący na każdym kroku takiego wyboru, który wydaje się w danym momencie najlepszy; zakładając, że seria wszystkich kroków doprowadzi do wyniku globalnie optymalnego
podział określonej waluty na nominały o określonej wartości