You are on page 1of 5

Tipo de cambio de monedas

Dado un conjunto de n tipos de monedas, cada una con valor di , y dada una cantidad p,
encontrar el nmero mnimo de monedas que tenemos que usar para obtener esa cantidad.
Por ejemplo, si se tienen monedas de 1, 2, 5 y 10 pesos y se deben devolver 28 pesos,
entonces la cantidad mnima de monedas a devolver es cinco (dos de 10 pesos, una de 5
pesos, una de 2 pesos y una de 1 peso). Es fcil notar que si no se tienen monedas de 1
peso, este problema no siempre se puede resolver (por ejemplo, no se puede dar cambio de
3 pesos usando slo monedas de 2, 5 y 10 pesos).
Podemos hacer uso de un algoritmo vido para minimizar, dado un sistema monetario, el
nmero de monedas necesarias para reunir una cantidad. Sin embargo, dicho algoritmo no
funciona cuando los tipos de monedas eran, por ejemplo, de 1, 5, 10, 25 y 12 unidades, ya
que no obtendramos necesariamente la descomposicin ptima. Dado que el algoritmo
vido para este problema falla en algunas ocasiones, nos planteamos si puede resolverse
utilizando Programacin Dinmica de forma que la solucin sea satisfactoria en todos los
casos.
Para el problema de las monedas con programacin dinmica se necesita crear
un algoritmo que permita a una mquina expendedora devolver el cambio mediante el
menor nmero de monedas posible.
Pero para poder implementar una solucin con programacin dinmica, el problema debe
cumplir con los 2 hallmarks que se requiere.

Hallmark 1: Substructura ptima


Considerar cualquier solucin ptima para hacer el cambio para n centavos usando
monedas de denominaciones d1, d2,. . . , dk.
Consideremos ahora romper esa solucin en dos piezas diferentes a lo largo de
cualquier lmite moneda. Supongamos que la "mitad izquierda" de la solucin se
queda con b centavos y la "mitad derecha" de la solucin con n - b centavos
restantes, como se muestra a continuacin.
Tanto la mitad izquierda como la derecha de la solucin deben ser ptimos al hacer
el cambio para b y n-b centavos respectivamente usando monedas de
denominaciones d1, d2,. . . , dk.
Por contradiccin, supongamos que hay una mejor solucin para hacer el cambio de
los b centavos "de la mitad izquierda" de la solucin ptima. A continuacin, la
mitad izquierda de la solucin ptima podra ser reemplazado con esta mejor
solucin, produciendo una solucin vlida para hacer el cambio para n centavos con
menos monedas que la solucin que est siendo considerada. Pero esto contradice la
supuesta optimidad de la solucin dada. Un idntico argumento se aplica a la "mitad
derecha" de la solucin.
Por lo tanto, la solucin ptima al problema de la moneda cambiante se compone de
soluciones ptimas a subproblemas ms pequeos.

Hallmark 2: Problemas Repetidos


Solucin: Definicin recursiva

Sea n el nmero de tipos de monedas distintos, L la cantidad a conseguir y T[1..n] un


vector con el valor de cada tipo de moneda del sistema. Supondremos que disponemos de
una cantidad inagotable de monedas de cada tipo. Llamaremos C(i,j) (1 i n, 1 j L) al
nmero mnimo de monedas para obtener la cantidad j restringindose a los tipos T[1],
T[2], ..., T[i]. Si no se puede conseguir dicha cantidad entonces C(i,j) = . En primer lugar
hemos de encontrar una expresin recursiva de C(i,j). Para ello observemos que en cada
paso existen dos opciones:
1. No incluir ninguna moneda del tipo T(i). Esto supone que el valor de C(i,j) va a
coincidir con el de C(i1,j), y por tanto C(i,j) = C(i1,j).
2. S incluirla. Pero entonces, al incluir la moneda del tipo T(i), el nmero de monedas
global coincide con el nmero ptimo de monedas para una cantidad (j T(i)) ms
esta moneda T(i) que se incluye, es decir podemos expresar C(i,j) en este caso como
C(i,j) = 1 + C(i,j T(i)). El clculo de C(i,j) ptimo tomar la solucin ms
favorable, es decir, el menor valor de ambas opciones. Con esto, la relacin en
recurrencia queda definida como:

Una vez disponemos de la solucin recursiva del problema, aplicaremos un algoritmo de


Programacin Dinmica para calcular los C(n,j), 1 j L, mediante el uso de un vector de
longitud L.

Algoritmo
Para cada casilla de la tabla hacer:
1. Si el valor de la moneda actual es mayor que la cantidad, se paga con el resto de
monedas, es decir, se toma el resultado de la casilla superior.
2. Si el valor de la moneda actual es menor o igual que la cantidad, se toma el mnimo
entre:
2.1. Pagar con el resto de monedas, tomando el resultado de la casilla superior.
2.2. Pagar con una moneda del tipo actual y el resto con el resultado que se hubiera
obtenido al pagar la cantidad actual a la que se le ha restado el valor de la moneda actual.
3. Tomar como resultado el valor de la ltima celda.
Pseudocdigo

Pseudocdigo para obtener la tabla

Pseudocdigo para saber Tipos de moneda a devolver


Ejemplo
Supongamos que se tienen monedas de valor 1, 4 y 6 y que se debe devolver una cantidad
correspondiente al valor 8. Siguiendo el mtodo de la programacin dinmica, se rellenar
una tabla con las filas correspondientes a cada valor para las monedas y las columnas con
valores desde el 1 hasta el 8. Cada posicin (i, j) de la tabla nos indica el nmero mnimo
de monedas requeridas para devolver la cantidad j con monedas con valor menor o igual al
de i:

Cmo calcular cuntas monedas de cada tipo deben usarse, es decir la solucin (x1 ,
x2 , ..., xn )?
Se usa otra tabla de decisiones tomadas:

Complejidad del tiempo de Ejecucin y espacio

Para estudiar el coste del algoritmo calculamos el tamao de la tabla que hay que construir:
N x (L + 1). Como las operaciones aritmticas involucradas son de coste constante, el
tiempo de ejecucin est en O(NL).

You might also like