Академический Документы
Профессиональный Документы
Культура Документы
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:
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
de
nat
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
public
int
Minima_devolucion(int
cantidad_devuelta,
int[]
monedas){
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
for(int
cantidad_devuelta; =
matriz_cambio[0][j]
for(int
i for(int
= j
1; =
i 1; j
<= <=
monedas.length
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];