Implementacja algorytmu wydawania reszty w języku Python
Problem 1
Zaimplementujemy funkcję zachlanne_wydawanie_reszty(), która dla zadanej reszty reszta_do_wydania zwróci liczbę monet lub banknotów z 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 monetarnysystem monetarny.
Specyfikacja:
Dane:
reszta_do_wydania – liczba naturalna; wartość reszty do wydania
Linia 1. Nominal 50 wydano 1 razy.
Linia 2. Nominal 20 wydano 1 razy.
Linia 3. Nominal 10 wydano 0 razy.
Linia 4. Nominal 5 wydano 1 razy.
Linia 5. Nominal 2 wydano 1 razy.
Linia 6. Nominal 1 wydano 0 razy.
Linia 7. Liczba nominalow uzytych do wydania reszty 77 dwukropek 4.
W kodzie źródłowym języka Python przedstawiono przykładową implementację algorytmu zachłannegoalgorytm zachłannyalgorytmu zachłannego, który może zostać wykorzystany do rozwiązania problemu. Funkcja zachlanne_wydawanie_reszty() przyjmuje dwa parametry:
Zmienna k wewnątrz pętli for przechowuje maksymalną liczbę powtórzeń danego nominału, przy pozostałej kwocie do wydania reszta_do_wydania. Wartość reszta_do_wydania 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 reszta_do_wydania.
Linia 1. def zachlanne podkreślnik wydawanie podkreślnik reszty otwórz nawias okrągły reszta podkreślnik do podkreślnik wydania przecinek nominaly zamknij nawias okrągły dwukropek.
Linia 2. wynik znak równości 0.
Linia 4. for nominal in nominaly dwukropek.
Linia 5. k znak równości reszta podkreślnik do podkreślnik wydania prawy ukośnik prawy ukośnik nominal.
Linia 6. wynik plus znak równości k.
Linia 7. reszta podkreślnik do podkreślnik wydania minus znak równości k asterysk nominal.
Linia 9. print otwórz nawias okrągły cudzysłów Nominao cudzysłów plus str otwórz nawias okrągły nominal zamknij nawias okrągły plus cudzysłów wydano cudzysłów plus str otwórz nawias okrągły k zamknij nawias okrągły plus cudzysłów razy cudzysłów zamknij nawias okrągły.
Linia 11. return wynik.
Linia 13. nominaly znak równości otwórz nawias kwadratowy 50 przecinek 20 przecinek 10 przecinek 5 przecinek 2 przecinek 1 zamknij nawias kwadratowy.
Linia 14. reszta podkreślnik do podkreślnik wydania znak równości 77.
Linia 15. k znak równości zachlanne podkreślnik wydawanie podkreślnik reszty otwórz nawias okrągły reszta podkreślnik do podkreślnik wydania przecinek nominaly zamknij nawias okrągły.
Linia 17. print otwórz nawias okrągły cudzysłów Liczba nominałów użytych do wydania reszty cudzysłów plus str otwórz nawias okrągły reszta podkreślnik do podkreślnik wydania zamknij nawias okrągły plus cudzysłów dwukropek cudzysłów plus str otwórz nawias okrągły k zamknij nawias okrągły zamknij nawias okrągły.
Przyjrzyjmy się innej implementacji funkcji zachlanne_wydawanie_reszty(), która w celu określenia liczby nominałów potrzebnej do wydania reszty reszta_do_wydania używa operacji dzielenia modulo. Możemy podzielić całkowicie resztę reszta_do_wydania przez dany nominał. Dzięki temu dowiemy się, ile sztuk danego nominału algorytm użyje do wydania reszty. Operacja modulo reszta_do_wydania %= nominal zwróci informację o tym, jaka kwota pozostała do wydania.
Linia 1. def zachlanne podkreślnik wydawanie podkreślnik reszty otwórz nawias okrągły reszta podkreślnik do podkreślnik wydania przecinek nominaly zamknij nawias okrągły dwukropek.
Linia 2. wynik znak równości 0.
Linia 4. for nominal in nominaly dwukropek.
Linia 5. k znak równości reszta podkreślnik do podkreślnik wydania prawy ukośnik prawy ukośnik nominal.
Linia 6. wynik plus znak równości k.
Linia 7. reszta podkreślnik do podkreślnik wydania procent znak równości nominal.
Linia 9. print otwórz nawias okrągły cudzysłów Nominal cudzysłów przecinek nominal przecinek cudzysłów wydano cudzysłów przecinek k przecinek cudzysłów razy cudzysłów zamknij nawias okrągły.
Linia 11. return wynik.
Linia 13. nominaly znak równości otwórz nawias kwadratowy 50 przecinek 20 przecinek 10 przecinek 5 przecinek 2 przecinek 1 zamknij nawias kwadratowy.
Linia 14. reszta podkreślnik do podkreślnik wydania znak równości 77.
Linia 15. k znak równości zachlanne podkreślnik wydawanie podkreślnik reszty otwórz nawias okrągły reszta podkreślnik do podkreślnik wydania przecinek nominaly zamknij nawias okrągły.
Linia 17. print otwórz nawias okrągły cudzysłów Liczba nominałów użytych do wydania reszty cudzysłów przecinek reszta podkreślnik do podkreślnik wydania przecinek cudzysłów dwukropek cudzysłów przecinek k zamknij nawias okrągły.
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 Python, 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 zachłanny
algorytm zachłanny
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
system monetarny
system monetarny
podział określonej waluty na nominały o określonej wartości