Está en la página 1de 7

Problema de las monedas con programacin dinmica

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. Mediante la programacin dinmica se solucionar el caso en el que el nmero de monedas de cada tipo es ilimitado. En el problema de las monedas mediante el algoritmo voraz el que el nmero de monedas es ilimitado.

Descripcin

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:

____ m1=1 m2=4 m3=6

1 1 1 1

2 2 2 2

3 3 3 3

4 4 1 1

5 5 2 2

6 6 3 1

7 7 4 2

8 8 2 2

Ejemplo para la posicin i = 2 y j = 7, se requiere una moneda tipo 2 con valor 4 y tres monedas de tipo 1 con valor uno, por lo tanto en la tabla el nmero de monedas en la posicin (2,7) sera 1 + 3 = 4.

Algoritmo

1.

Para

cada

casilla

de

la

tabla

hacer:

2. 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.

3. Si el valor de la moneda actual es menor o igual que la cantidad, se toma el mnimo entre: 1. Pagar con el resto de monedas, tomando el resultado de la casilla superior.

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.

4.

Tomar

como

resultado

el

valor

de

la

ltima

celda.

Pseudocdigo

Solucionemos

este problema

de

programacin

dinmica en

un

pseudocdigo.

Como parmetros de entrada, la funcin toma C, que corresponde con la cantidad a devolver, y un vector M de monedas, que almacena el valor de cada tipo. Devuelve num, el nmero de monedas necesarias para realizar la devolucin.

fun var

cambio

(C:

nat;

M[1..n]

de

nat)

dev

num:

nat

T[0..n][0..C] begin T[0][1..C] T[1..n][0] para i := para si M[i] > j j 1 := entonces :=

de

nat

\infty; := 0; n hasta C := hacer hacer j] no

hasta 1 T[i,

j]

T[i-1, si

T[i, j] := min {T[i-1, j], T[i, j-M[i] ] + 1 } fsi fpara fpara num ffun := T[n, C]

Cdigo

Java

Solucionemos este problema de programacin dinmica en un cdigo Java:

public

int

Minima_devolucion(int

cantidad_devuelta,

int[]

monedas){

//Creamos int[][] [cantidad_devuelta+1];

la matriz_cambio

matriz = new

de

devoluciones

int[monedas.length+1]

//Rellenamos for(int i =

la 0;

1 i <

columna

de

ceros i++) 0;

monedas.length; =

matriz_cambio[i][0]

//La

fila j =

menos 1;

la j

1 <=

columna

un

nmero

alto j++) 999999;

for(int

cantidad_devuelta; =

matriz_cambio[0][j]

for(int

i for(int

= j

1; =

i 1; j

<= <=

monedas.length

i++) j++){ ){ devolver

cantidad_devuelta; > cantidad a j

if(monedas[i-1] //Si la moneda es superior = a la

matriz_cambio[i][j]

matriz_cambio[i-1][j]; }else{

//Si

la

moneda

no

es

superior

la

cantidad

devolver

//Calcular int

cual minimo

es =

el 0;

mnimo

de

estas

dos

posiciones el mnimo

//Guardaremos

aqu

if(matriz_cambio[i-1][j] < matriz_cambio[i][j - monedas[i-1]] + 1){ minimo = matriz_cambio[i-1][j]; }else{ minimo = matriz_cambio[i][j monedas[i-1]] + 1; } //Guardamos matriz_cambio[i][j] = mnimo minimo; }

return }

matriz_cambio[monedas.length][cantidad_devuelta];