Professional Documents
Culture Documents
La programacion dinamica no utiliza recursividad, sino que alamcena los resultados de las subproblemas en una tabla , calculando primero las soluciones para los problemas pequenos.
CARACTERISTICAS DE PROGRAMACION
Para que un problema pueda ser resuelto con la tcnica de programacin dinmica, debe cumplir con ciertas caractersticas:
La decisin tomada en una etapa determina cual ser el estado de la etapa siguiente.
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 limitado.
1. Si el valor de la moneda para dar el cambio que se llamara saldo es mayor o igual que la primera moneda de mayor valor ingresado entonces se restan ambos. 2. Si el saldo restante de valor de la moneda para dar el cambio sigue siendo mayor o igual que la primera moneda de mayor valor ingresado entonces se vuelve a restar 3. si no cumple se vuelve evaluar con la segunda moneda de mayor valor ingresado, y as sucesivamente. 4. En caso que la resta del saldo llegue a ser cero, se entrega la cantidad de monedas con el valor de la moneda usada el cual en conjunto representa la cantidad del valor de la moneda que se desea dar el cambio. 5. Si se da el caso que la resta sea diferente que cero entonces se devuelven a las cadenas el valor de las cantidades que ha sido restado. Dando la notificacin de que no es posible el cambio. 6. La entrega de monedas para dar el cambio debe ser el mnimo.
Ingresamos
N= 5
monedas
mon
can Usa
50
2 0
10
2 0
6
2 0
4
2 0
1
2 0
Auxiliares
Auxcan can USA (A)[ ] = {0} , COM A = 0 , USA (B) [ ] = {0} , COM B = 0.
pos
0 50 2 1 0 Usa (A)
1 10 2 0
2 6 2 0 0
3 4 2 0 0
4 1 2 0 0 0 0
SALDO = SALDO/2 NUEVO SALDO = 31 Buscar no se encuentra si auxcan[i] >= 1 Entonces saldo = ( saldo* 2 ) mon [i] NUEVO SALDO = 12 Usamos 1
1 moneda s/. 50
SALDO = = 0
0 50 1 0 Usa (A)
1 10 2 0
2 6 2 1 0 1
3 4 2 0 0
4 1 2 0 0 0 0
PARA i=0
12 >= 50
Usa
PARA i=1
12 >= 10
SALDO
12 1 Usamos 1 s/. 6
SALDO = SALDO/2 NUEVO SALDO = 6 Buscar Si se encuentra Entonces saldo = ( saldo* 2 ) mon [pos] NUEVO SALDO = 6
Pos = 2
moneda
si auxcan[pos] >= 1
SALDO = = 0
0 50 1 0 Usa (A)
1 10 2 0
2 6 0 1 0 1
3 4 2 0 0
4 1 2 0 2 1 0 0
PARA i=1
6 >= 10 6 >= 6 6
Usa
PARA i=2
SALDO
SALDO = SALDO/2 NUEVO SALDO = 3 Buscar No se encuentra si auxcan[i] >= 1 Entonces saldo = ( saldo* 2 ) mon [i] NUEVO SALDO = 0 Usamos 1 moneda
1 s/. 6
SALDO = = 0
Entonces
Usa (A) 1 0 2 0 0
ComA = 3
1 10 2 0
2 6 0 0 1 0
3 4 2 0 0 0
4 1 2 0 2 0 0 0 0 0
Usa
SALDO = SALDO/2 NUEVO SALDO = 31 Buscar no se encuentra si auxcan[i] >= 1 Entonces saldo = ( saldo* 2 ) mon [i] NUEVO SALDO = 12 Usamos 1
1 moneda s/. 50
SALDO = = 0
ComA = 3
1 10 2 1 0
2 6 0 0 1 1
3 4 2 0 0 0
4 1 2 0 0 0 0 0 0 0
PARA i=0
12 >= 50
Usa
PARA i=1
12 >= 10
SALDO
SALDO = SALDO/2 NUEVO SALDO = 6 Buscar Si se encuentra Entonces saldo = ( saldo* 2 ) mon [i] NUEVO SALDO = 2
Pos = 2
si auxcan[pos] >= 1
SALDO = = 0
ComA = 3
pos mon
1 10 1 0
2 6 0 0 1 1
3 4 2 0 0 1
4 1 1 2 0 0 0 0 0 0 0
PARA i=1
2 2 2 >= 10 >= 6 >= 4
s/. 1
SALDO = = 0
ComA = 3
0 50 0 0 Usa (A)
1 10 1 0
2 6 0 0 1 1
3 4 2 0 0 1
4 1 1 0 0 0 0 0 0 0
PARA i=4
1 >= 1 SALDO 1 SALDO = SALDO/2 NUEVO SALDO = 0.5 Buscar No se encuentra
Entonces saldo = saldo mon [pos] NUEVO SALDO = 0
Usa (B)
2 1
1 Usamos 1 moneda
s/. 1
SALDO = = 0
Entonces
Usa (B) 1 1 0 0 2
AHORA
Usa
= Usa
Usa
+
1 0 0 0 2 0 0
AHORA
Usa 1 0 2 0 0
can
= can
Can
1 2 2 2 0 2 2
0 50 1 1
1 10 2 0
2 6 0 2
3 4 2 0
4 1 2 0
Se hace entrega de 1 2
moneda
moneda
s/. 50 s/. 6
pos
0 50 2 1 0 Usa (A)
1 10 2 0
2 6 2 0 0
3 4 2 0 0
4 1 2 0 0 0 0
SALDO = SALDO/2 NUEVO SALDO = 26.5 Buscar no se encuentra si auxcan[i] >= 1 Entonces saldo = ( saldo* 2 ) mon [i] NUEVO SALDO = 3 Usamos 1
1 moneda s/. 50
SALDO = = 0
pos mon
0 50 1 0 Usa (A)
1 10 2 0
2 6 2 0 1
3 4 2 0 0
4 1 1 2 0 0 0 0
PARA i=1
3 3 3 >= 10 >= 6 >= 4
s/. 1
SALDO = = 0
0 50 1 0 Usa (A)
1 10 2 0
2 6 2 0 1
3 4 2 0 0
4 1 0 1 0 0 0 2 1
PARA i=4
2 >= 1 SALDO 1 SALDO = SALDO/2 NUEVO SALDO = 1
Buscar
Si se encuentra Pos = 4 Usamos 1 moneda s/. 1 si auxcan[pos] >= 1 Entonces saldo = (saldo*2) mon [pos] NUEVO SALDO = 1
SALDO = = 0
0 50 1 0 Usa (A)
1 10 2 0
2 6 2 0 1
3 4 2 0 0
4 1 0 0 0 0 2
PARA i=4
1 >= 1 SALDO 1 SALDO = SALDO/2 NUEVO SALDO = 0.5
Buscar
No se encuentra si auxcan[i] >= 1 Entonces SALDO = 1
SALDO = = 0 i=5
i=i +1
Ahora
i es igual N
0 50 2 0
1 10 2 0
2 6 2 0
3 4 2 0
4 1 2 0
Se hace entrega de
Con el desarrollo de la investigacin nos hemos podido dar cuenta que la programacin dinmica es un mtodo para reducir el tiempo de ejecucin del algoritmo, ya que se desarrolla mediante subproblemas. Adems la programacin dinmica es un mtodo capaz de resolver de manera eficiente algunos algoritmos que alguna no pudieron ser desarrollados por otras tcnicas. La programacin dinmica encuentra la solucin optima de un problema con n variables descomponindolos en n etapas, siendo cada eta a un subproblema de una sola variable, sin embargo, como naturaleza de la etapa difiere de acuerdo con el problema de optimizacin. Los clculos de programacin dinmica se hacen en forma recursiva, ya que la solucin ptima de un problema se usa como dato para el siguiente subproblema. Para cuando se resuelve el ltimo problema queda en la mano la solucin optima de todo el problema.