from random import randint
kasa_fiskalna = {
1: 0,2: 0, 5: 0, 10: 0, 20: 0, 50: 0, 100: 0, 200: 0, 500: 0, 1000:0, 2000: 0, 5000: 0, 10000: 0, 20000: 0, 50000: 0
}
# Losowe wygenerowanie stanu kasy. Dodanie do słownika dla pewnych kluczy losowych wartości
def generowanieStanuKasy():
for klucz in kasa_fiskalna:
klucz_nominal = int(klucz) / 100
kasa_fiskalna[klucz] = int(input('Podaj ilość nominału %s [zł]:' % klucz_nominal))
#kasa_fiskalna[klucz] = randint(0,20)
# Stworzenie listy z nominałami ze słownika który losowo wygenerował jakieś banknoty
def generowanieTablicyZNominalamiZeStanuKasy():
tablicaNominalow = []
for klucz, wartosc in kasa_fiskalna.items():
tablicaNominalow.extend([klucz] * wartosc)
return tablicaNominalow
# Podanie kwoty do zapłaty. Aktualizacja tablicy z nominałami. Wyliczenie reszty potrzebnej do wydania
def obliczSumeDoWydania(tablicaNominalow):
kwotaDoZaplaty = int(float(input('Kwota do zapłaty w złotówkach (grosze podaj po przecinku): '))*100) # kwota do zapłaty zamieniona na grosze
sumaZapłacona = 0
print("Kwota do zapłaty: %s [gr] \n\n" % kwotaDoZaplaty)
print("Rozpoczynam pobieranie banknotów od klienta: \n\n")
while sumaZapłacona <= kwotaDoZaplaty:
nominal = int(float(input('Podaj nominal w zł (w przypadku monet groszowych podaj je po przecinku):'))*100)
if nominal not in kasa_fiskalna.keys():
print("Nieprawidłowy nominał - podaj nominał ponownie")
continue
tablicaNominalow.append(nominal)
sumaZapłacona += int(float(nominal))
return tablicaNominalow, sumaZapłacona - kwotaDoZaplaty
# Dynamiczny algorytm wydawania monet
def wydajMonety(kwota, monety):
listaPrzedzialu = [float('inf')] * (kwota + 1)
listaPrzedzialu[0] = 0
wybraneMonety = [[] for _ in range(kwota + 1)]
for i in range(1, kwota + 1):
for moneta in monety:
if moneta <= i:
if 1 + listaPrzedzialu[i - moneta] < listaPrzedzialu[i]:
listaPrzedzialu[i] = 1 + listaPrzedzialu[i - moneta]
wybraneMonety[i] = (wybraneMonety[i - moneta] + [moneta])
return wybraneMonety[kwota]
generowanieStanuKasy()
tablicaNominalow = generowanieTablicyZNominalamiZeStanuKasy()
tablicaNominalow, reszta = obliczSumeDoWydania(tablicaNominalow)
wydane_monety = wydajMonety(reszta, tablicaNominalow)
print("Wydana reszta:", wydane_monety)
print("Niewydana reszta:", reszta - sum(wydane_monety))