Based on the algorithm in this hacker rank video, link , I have tried to create my own algorithm that returns the value that I am looking.
Basically, to save you 10 minutes, the algorithm of that video is recursive and stores the information it returns in each iteration somewhere, in the case of the video it is a hashmap. The trick comes because this algorithm is going to make a different action depending on the current values. from there comes the name of "Memoization".
That algorithm returns several combinations that in my case in particular do not help, so try to create my own algorithm.
I need to find the minimum exchange value given a denomination of Mexican coins (1, 2, 5, 10). So what I'm looking for is to create an algorithm that returns the first combination that it finds and fits.
import array
#aqui se crean 4 pilas de 1, 2, 5 y 10 monedas
uno = [1 for i in range(10)]
dos = [2 for i in range(10)]
cinco = [5 for i in range(10)]
diez = [10 for i in range(10)]
monedas = [diez, cinco, dos, uno]
#esta pila almacena las demas pilas de monedas
cont = len(monedas)-1
#contador para indices de arrays
cont2 = 0
#cuenta las iteraciones que lleva el programa
cant = int(input("dame el cambio a regresar: "))
temp = [cant]
#temporal sera una variable que se ira restando conforme avance el
#metodo en su recursion.
res = ""
# res es el diccionario donde se almacenara
# las combinaciones de monedas resultantes
#el punto de este algoritmo (cambio(etc,...)) es devolver la menor
#combinacion de monedas posibles
# este es un algoritmo que no garantiza el minimo valor logico posible
# de cambio pero intenta maximizar el tiempo
#este algoritmo va devolviendo un valor diferente cada vez que
# se itera, y este valor se va concatenando junto con otros en
# un string, que va a terminar siendo el resultado
def cambio(temp, monedas, cont, res, cont2):
if (temp >= monedas[cont]):
#si la cantidad a dividir en mas monedas es mayor que
#la moneda seleccionada en la pila de monedas
temp.insert(cont2+1, temp[cont2] -monedas[cont])
print("$",temp,"- $",monedas[cont])
print("cambio: ",res)
res = res + temp + "-"
return cambio(temp, monedas, cont, res, cont2)
if (temp <= monedas[cont]):
#si el valor a dividir en monedas es menor
#al valor de la moneda actualmente seleccionada
#en la lista
temp.insert(cont2+1, temp[cont2] - monedas[cont])
##cont2 lleva el orden de las monedas de mayor a menor
print("cambio: ",res)
res = res + temp + "-"
return cambio(temp, monedas, cont-1, res, cont2)
if (temp == monedas[cont]):
#si la cantidad a calcular es identica al valor de la moneda
#que esta seleccionada de la pila
temp.insert(cont2+1, temp[cont2] - monedas[cont])
print("cambio: ",res)
res = res + temp + "-"
return cambio(temp, monedas, cont-1, res, cont2)
if (temp == 1):
## si el cambio ya alcanzo 1
temp.insert(cont2+1, temp[cont2] - monedas[cont])
print("cambio: ",res)
return 0;
if (temp == 0):
##si el cambio ya alcanzo 0
print("cambio: ",res)
return 0
## aqui se termina la recursion en el caso de que el valor
## restante sea cero
##fin de metodo
cambio(temp, monedas, cont, res, cont2)
When running it, it gives this error:
give me the change to return: 8
Traceback (most recent call last):
File "C: \ Users \ jose miguel \ Desktop \ Python Exercises \ Currency exchange attempt
8.py ", line 89, in
change (temp, coins, cont, res, cont2)
File "C: \ Users \ jose miguel \ Desktop \ Python Exercises \ currency exchange> try 8.py", line 44, in change
temp.insert (cont2 + 1, temp [cont2] -coins [cont])
TypeError: unsupported operand type (s) for -: 'int' and 'list'
What's wrong? please help me, I have been stuck in this problem for 3 months now: (