Está en la página 1de 32

La programacion dinamica se suele utilizar en problemas de optimizacion, donde una solucion esta formada por una serie de decisiones.

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.

Programacin dinmica determinstica.

Programacin dinmica probabilstica.

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.

Naturaleza secuencial de las decisiones: El problema puede ser dividido en etapas.


Cada etapa tiene un nmero de estados asociados a ella. La decisin ptima de cada etapa depende solo del estado actual y no de las decisiones anteriores.

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

Dar cambio para s/.62


FOR 1 PARA i=0
62 >= 50 SALDO
62

mon Aux can 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

pos mon Aux can

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

pos mon Aux can

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 = ComA + ComA = 1 3

ComA = 3

pos mon Aux can

0 50 1 0 0 Usa (A) Usa (B)

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

FOR 2 PARA i=0


62 >= 50 SALDO
62

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

pos mon Aux can

0 50 0 0 Usa (A) Usa (B)

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

12 1 Usamos 1 moneda s/. 10

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

0 50 0 0 Usa (A) Usa (B)

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

Aux can Usa

PARA i=2 PARA i=3 PARA i=4


2 >= 1 SALDO 2 SALDO = SALDO/2 NUEVO SALDO = 1 Buscar Si se encuentra Pos = 4 Entonces saldo = ( saldo* 2 ) mon [pos] NUEVO SALDO = 1 si auxcan[pos] >= 1 1 Usamos 1 moneda

s/. 1

SALDO = = 0

ComA = 3

pos mon Aux can Usa

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

ComA = ComA + ComA = 4 2 1

AHORA

ComA < ComB


ENTONCES
Usa (A) 1 0 2 0 0

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

pos mon can Usa

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

Usando solo 3 monedas

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

Dar cambio para s/. 53


FOR 1 PARA i=0
53 >= 50 SALDO
53

mon Aux can Usa

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

Aux can Usa

PARA i=2 PARA i=3 PARA i=4


3 >= 1 SALDO 3 SALDO = SALDO/2 NUEVO SALDO = 1.5 Buscar Si se encuentra Pos = 4 Entonces saldo = ( saldo* 2 ) mon [pos] NUEVO SALDO = 2 si auxcan[pos] >= 1 1 Usamos 1 moneda

s/. 1

SALDO = = 0

pos mon Aux can Usa

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

pos mon Aux can Usa

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

si saldo diferente de cero


entonces
Usa (A) 1 0 0 0 0 2 0

i es igual N

pos mon can Usa

0 50 2 0

1 10 2 0

2 6 2 0

3 4 2 0

4 1 2 0

Se hace entrega de

No es posible dar el cambio

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.