PRÁCTICA:
Devolución de cambio con mínimo número de
monedas
Si una persona nos pagase un periódico, que cuesta 1,25€, con un billete de 5€, tendríamos que devolver 3,75€, pero podríamos elegir
diferentes cambios, por ejemplo:
375 monedas de 0.01€
3 monedas de 1€ y 15 monedas de 0.05€
3 monedas de 1€, 1 moneda de 0.50€, 1 moneda de 0.20€ y 1 moneda de 0.05€
Si quisiésemos que el número de monedas fuese el mínimo posible, la solución sería: 1 moneda de 2€, 1 moneda de 1€, 1 moneda de
0,50€, 1 moneda 0,20€ y 1 moneda de 0,05€.
(a) Devolución sin restricciones. Considerando que no tenemos ninguna limitación en el número de monedas de que disponemos para
hacer la devolución, escribe un programa que solucione el problema de la devolución de moneda.
(b) Devolución con límite de monedas. La solución basada en la premisa de que siempre tenemos las monedas sucientes de cualquier
tipo para hacer la devolución no es muy realista. Resuelve el problema de la devolución de moneda, suponiendo que puede haber
limitaciones en el número de monedas de las que disponemos para dar el cambio.
#Apartado a)
def cambio(val):
cent = val * 100
mon2e = cent // 200
count1 = cent % 200
mon1e = count1 // 100
count2 = count1 % 100
mon50cent = count2 // 50
count3 = count2 % 50
mon20cent = count3 // 20
count4 = count3 % 20
mon10cent = count4 // 10
count5 = count4 % 10
mon5cent = count5 // 5
count6 = count5 % 5
mon2cent = count6 // 2
count7 = count6 % 2
mon1cent = count7 % 2
return(int(mon2e),int(mon1e),int(mon50cent),int(mon20cent), \
int(mon10cent),int(mon5cent),int(mon2cent),int(mon1cent))
#Apartado b)
def cambio_rest(val,lim2e,lim1e,lim50,lim20,lim10,lim5,lim2,lim1):
cent = val * 100
mon2e = 0
mon1e = 0
mon50cent = 0
mon20cent = 0
mon10cent = 0
mon5cent = 0
mon2cent = 0
mon1cent = 0
while mon2e < lim2e and cent >= 200:
cent = cent - 200
mon2e = mon2e + 1
while mon1e < lim1e and cent >= 100:
cent = cent - 100
mon1e = mon1e + 1
while mon50cent < lim50 and cent >= 50:
cent = cent - 50
mon50cent = mon50cent + 1
while mon20cent < lim20 and cent >= 20:
cent = cent - 20
mon20cent = mon20cent + 1
while mon10cent < lim10 and cent >= 10:
cent = cent - 10
mon10cent = mon10cent + 1
while mon5cent < lim5 and cent >= 5:
cent = cent - 5
mon5cent = mon5cent + 1
while mon2cent < lim2 and cent >= 2:
cent = cent - 2
mon2cent = mon2cent + 1
while mon1cent < lim1 and cent >= 1:
cent = cent - 1
mon1cent = mon1cent + 1
if (val * 100 - (mon2e * 200 + mon1e * 100 + mon50cent * 50 + mon20cent * 20 \
+ mon10cent * 10 + mon5cent * 5 + mon2cent * 2 + mon1cent)) == 0:
result = True
else:
result = False
return result, mon2e, mon1e, mon50cent, mon20cent, mon10cent, mon5cent, \
mon2cent, mon1cent
Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/fontdata.js