I_R_W14_M37_Java Algorytmy zachłanne
Implementacja algorytmu wydawania reszty w języku Java
Zaimplementujemy metodę 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 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 Java przedstawiono przykładową implementację algorytmu zachłannego, który może zostać wykorzystany do rozwiązania problemu wydawania reszty. Metoda 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ć całkowicie resztę resztaDoWydania przez nominał nominaly[i], zaokrąglając tym samym wynik dzielenia 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 Java, 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.