Está en la página 1de 33

Ejercicio 1.

Programaci on din amica


[ITIS/ITIG, Feb 2007] Dada una cantidad de dinero C , deseamos encontrar el m nimo n umero de monedas que cubra exactamente, si es posible, esta cantidad. Para ello conocemos los valores de los N tipos de monedas y el n umero de monedas disponibles de cada tipo. Dise na un algoritmo din amico que resuelva el problema detallando lo siguiente: La estructura de c alculos intermedios. (0,5 puntos) La relaci on recursiva. (1 punto) La funci on o procedimiento que implemente este algoritmo. (2,5 puntos).

Yolanda Garc a, Jes us Correas (DSIC - UCM)

1 / 32

Soluci on Ejercicio 1. Programaci on din amica


Este ejercicio es muy parecido al que hemos visto anteriormente de devoluci on del cambio La diferencia es que el n umero de monedas disponibles de cada tipo es limitado Recordando el caso de estudio de devoluci on del cambio, la expresi on recurrente que lo den a era: C [i , j ] = m n(C [i 1, j ], 1 + C [i , j di ]) De los dos accesos recurrentes de la expresi on anterior:
a) C [i 1, j ] corresponde con la decisi on de no tomar ninguna moneda de valor di . Este caso no modica el n umero de monedas utilizado para obtener C [i , j ]. No afecta la limitaci on en el n umero de monedas. b) 1 + C [i , j di ] corresponde con la selecci on de una moneda de valor di (al menos). Este caso s modica el n umero de monedas que se necesita para obtener C [i , j ] en funci on de C [i , j di ], pues se utiliza una moneda de valor di .
Yolanda Garc a, Jes us Correas (DSIC - UCM) 2 / 32

Soluci on Ejercicio 1. Programaci on din amica (cont.)


Una posible soluci on es considerar tantos casos como monedas de valor di est en disponibles, y despu es calcular el m nimo de todos ellos C [i , j ] = m n (k + C [i 1, j di k ])
0k mi

donde mi es el n umero de monedas disponibles de valor di . La recurrencia completa es:


0 + +

C (i , j ) =

0k mi

si j = 0 si j < 0 si i = 1 y (j < di o j > di mi o j mod di = 0) j /di si i = 1 y j mod di = 0 y j di mi m n (k + C [i 1, j di k ]) en otro caso

Para cada uno de los valores de k (desde 1 hasta mi ) se considera tomar las k monedas de valor di , en lugar de hacerlo de una en una como en la versi on original del problema de devoluci on del cambio
Yolanda Garc a, Jes us Correas (DSIC - UCM) 3 / 32

Soluci on Ejercicio 1. Programaci on din amica (cont.)


fun monedas2(d[1..N], m[1..N],Cant) crear C[1..N,0..Cant] desde i 1 hasta N hacer C[i,0] 0 desde i 1 hasta N hacer desde j 1 hasta Cant hacer si i=1 Y j<d[i] entonces C[i,j] + si no si i=1 entonces si j mod d[i] = 0 Y j div d[i] m[i] entonces C[i,j] j div d[i] si no C[i,j] + si no min + desde k 0 hasta m n(j div d[i], m[i]) hacer si min > k+C[i-1,j-k*d[i]] entonces min k+C[i-1,j-k*d[i]] n desde C[i,j] min n si n desde n desde devolver C[N,Cant] n fun
Yolanda Garc a, Jes us Correas (DSIC - UCM) 4 / 32

Ejercicio 2. Programaci on din amica


[ITIS/ITIG, Sep 2007] En el departamento de una empresa de traducciones se desea hacer traducciones de textos entre varios idiomas. Se dispone de algunos diccionarios. Cada diccionario permite la traducci on (bidireccional) entre dos idiomas. En el caso m as general, no se dispone de diccionarios para cada par de idiomas por lo que es preciso realizar varias traducciones. Dados N idiomas y M diccionarios, determina si es posible realizar la traducci on entre dos idiomas dados y, en caso de ser posible, determina la cadena de traducciones de longitud m nima. Dise na un algoritmo din amico que resuelva el problema detallando lo siguiente: 1. La estructura de c alculos intermedios utilizada (0,5 puntos). 2. La relaci on recursiva entre subproblemas (0,5 puntos). 3. El procedimiento o funci on que implemente el algoritmo (2 puntos).

Yolanda Garc a, Jes us Correas (DSIC - UCM)

5 / 32

Ejercicio 2. Programaci on din amica (cont.)

Ejemplo 1: Traducir del lat n al arameo disponiendo de los siguientes diccionarios: lat n-griego, griego-etrusco, griego-dem otico, dem otico-arameo Soluci on: s es posible la traducci on: lat n-griego-dem otico-arameo, realizando tres traducciones. Ejemplo 2: Traducir del lat n al arameo disponiendo de los siguientes diccionarios: lat n-griego, arameo-etrusco, griego-dem otico, dem otico-hebreo Soluci on: No es posible la traducci on.

Yolanda Garc a, Jes us Correas (DSIC - UCM)

6 / 32

Soluci on ejercicio 2. Programaci on din amica


Una forma sencilla de representar este problema es considerando las secuencias de traducciones como caminos de un idioma a otro De esta forma, podemos considerar los idiomas como los nodos de un grafo, y los diccionarios como las aristas Es importante tener en cuenta lo que se pide como resultado del algoritmo:
a) saber si es posible la traducci on entre dos idiomas dados b) y la cadena de traducciones de longitud m nima

Vemos que es un problema de optimizaci on (cadena de traducciones de longitud m nima), y conocemos un algoritmo para calcular los caminos m nimos entre cualquier par de nodos de un grafo: el algoritmo de Floyd El u nico dato que nos falta para aplicarlo directamente es la longitud y orientaci on de las aristas
Yolanda Garc a, Jes us Correas (DSIC - UCM) 7 / 32

Soluci on ejercicio 2. Programaci on din amica (cont.)


Si s olo nos pidieran saber si es posible la traducci on entre dos idiomas, podr amos utilizar una versi on simplicada del algoritmo de Floyd: el algoritmo de Warshall, que utiliza una matriz de adyacencia booleana para saber si dos nodos est an conectados o no (en lugar de una matriz de distancias), [GV00], p. 197 Como nos piden la cadena m nima, debemos asignar una distancia en cada arista, por ejemplo 1 Tambi en se dice que los diccionarios permiten traducciones bidireccionales: por cada diccionario habr a dos aristas, cada una en un sentido (la matriz de adyacencia ser a sim etrica) Respecto a las estructuras de datos intermedias:
En el algoritmo de Floyd vimos que la estructura de datos intermedia coincide con la matriz resultado, y es una matriz cuadrada N N Tambi en se nos pide la cadena de traducciones por las que tenemos que pasar: necesitamos una matriz para almacenar los nodos intermedios por los que pasan los caminos m nimos
Yolanda Garc a, Jes us Correas (DSIC - UCM) 8 / 32

Soluci on ejercicio 2. Programaci on din amica (cont.)


fun trad(L[1..n,1..n],i,j,c[1..n]) crear D[1..n,1..n],P[1..n,1..n] oyd(L,D,P) si D[i,j] = + entonces k1 cam(P,i,j,c,k) c[k] -1 n si devolver D[i,j] n fun proc cam(P[1..n,1..n],i,j,c[1..n],k) si P[i,j] = 0 entonces cam(P,i,P[i,j],c,k) c[k] P[i,j] k k+1 cam(P,P[i,j],j,c,k) n si n proc
Yolanda Garc a, Jes us Correas (DSIC - UCM)

proc oyd(L[1..n,1..n],D[1..n,1..n],P[1..n,1..n]) desde i 1 hasta n hacer desde j 1 hasta n hacer P[i,j] 0 n desde n desde DL desde k 1 hasta n hacer desde i 1 hasta n hacer desde j 1 hasta n hacer si D[i,k]+D[k,j] < D[i,j] entonces D[i,j] D[i,k]+D[k,j] ; P[i,j] k n si n desde n desde n desde n proc

9 / 32

Ejercicio 3. Programaci on din amica


[ITIS/ITIG, Jun 2007] Un exc entrico nutricionista va a un restaurante. En la carta aparecen todos los platos disponibles con el n umero de calor as. El nutricionista conoce el n umero m nimo de calor as que su cuerpo necesita en esa comida. Su objetivo es encontrar el men u que cubra exactamente esa cantidad de calor as o las supere de forma m nima. Adem as, no quiere repetir platos. Dise na un algoritmo din amico que determine qu e platos forman parte del men u optimo y el n umero de calor as del men u optimo. Detalla lo siguiente: 1. Las estructuras y/o variables necesarias para representar la informaci on del problema (0,5 puntos). 2. La estructura de c alculos intermedios utilizada (1 punto). 3. La relaci on recursiva entre subproblemas (1 punto). 4 y 5. El procedimiento o funci on que implementa el algoritmo (2,5 puntos).
Yolanda Garc a, Jes us Correas (DSIC - UCM) 10 / 32

Soluci on ejercicio 3. Programaci on din amica


Este problema es de optimizaci on (men u con m nimo n umero de calor as por encima de una cantidad) Entre los problemas que ya hemos visto, el m as parecido es el de la mochila 0-1, pues los platos de la carta se eligen completos o no se eligen Las diferencias con este problema son: a) c omo se calcula el optimo (m nimo en lugar de m aximo), y b) la existencia de un valor de referencia (n umero m nimo de calor as necesario) Estas diferencias pueden resolverse utilizando una expresi on recurrente apropiada para llenar la tabla Para conocer las estructuras necesarias para representar el problema es necesario analizar lo que se nos proporciona y se nos pide:
Se nos proporciona el n umero de calor as de cada plato: un vector C [1..n], donde n es el n umero de platos de la carta Se nos pide el men u elegido: un vector M [1..n] de los platos elegidos (el tama no del vector es el n umero m aximo de platos que podemos elegir) Tambi en se nos pide el n umero de calor as de este men u
Yolanda Garc a, Jes us Correas (DSIC - UCM) 11 / 32

Soluci on ejercicio 3. Programaci on din amica (cont.)


La estructura de datos intermedia puede ser, como en el problema de la mochila, una matriz D [1..n, 0..Cal ] con una la por cada plato de la carta (desde 1 hasta n), y el n umero total de calor as en las columnas D [i , j ] contiene el n umero de calor as del men u optimo considerando los i primeros platos de la carta: aqu el con el menor n umero de calor as (mayor o igual a j ) El valor que buscamos es el correspondiente a D [n, Cal ] Para calcular D [i , j ], se pueden dar dos casos:
Si no se elige el plato i de la carta, entonces el men u elegido para D [i , j ] contendr a exclusivamente platos de 1 a i 1: D [i 1, j ] Si se elige el plato i , entonces el n umero de calor as total del men u D [i , j ] es ci + D [i 1, j ci ]

Yolanda Garc a, Jes us Correas (DSIC - UCM)

12 / 32

Soluci on ejercicio 3. Programaci on din amica (cont.)


Hay que tener en cuenta algunos casos especiales:
D [1, j ] = +, j > c1 , porque no es posible conseguir un men u de m as de c1 calor as utilizando exclusivamente el plato 1 (no se puede repetir el mismo plato) D [1, j ] = c1 , 0 < j c1 D [i , j ] = 0, j 0, pues el men u optimo con al menos 0 (o menos) calor as consiste en no elegir ning un plato

Por tanto, la expresi on recurrente es la siguiente:


0 si j 0 + si i = 1 y j > ci D [i , j ] = c si i = 1 y 0 < j ci 1 m n(C [i 1, j ], ci + C [i 1, j ci ]) en otro caso

la funci on m n() permite elegir el men u de menos calor as Los valores de la tabla con valor + garantizan que no se va a elegir un men u que tenga menos calor as que el m nimo necesario
Yolanda Garc a, Jes us Correas (DSIC - UCM) 13 / 32

Soluci on ejercicio 3. Programaci on din amica (cont.)


fun menu(c[1..n],Cal,m[1..n]) crear D[1..n,0..Cal] desde pl 1 hasta n hacer D[pl,0] 0 desde ncal 1 hasta Cal hacer si pl=1 Y ncal > c[1] entonces D[pl,ncal] + si no si pl=1 entonces D[pl,ncal] c[1] si no si ncal < c[pl] entonces D[pl,ncal] m n(D[pl-1,ncal],c[pl]) si no D[pl,ncal] m n(D[pl-1,ncal],c[pl]+D[pl-1,ncal-c[pl]]) n si n desde n desde si D[n,Cal] < + entonces obtener menu(D,c,m) devolver D[n,Cal] n fun
Yolanda Garc a, Jes us Correas (DSIC - UCM) 14 / 32

Soluci on ejercicio 3. Programaci on din amica (cont.)


proc obtener menu(D[1..n,0..Cal],c[1..n],m[1..n]) plato 1 in j Cal mientras i > 0 Y j > 0 hacer si D[i,j]=D[i-1,j] entonces i i-1 si no m[plato] i plato plato + 1 j j-c[i] i i-1 n si n mientras desde i plato hasta n hacer m[i] -1 n desde n proc
Yolanda Garc a, Jes us Correas (DSIC - UCM) 15 / 32

Ejercicio 4. Programaci on din amica

[GV00] Supongamos que existen n bancos en los que podemos invertir, y disponemos de una cantidad Cant para invertirla. Cada banco nos proporciona intereses seg un una funci on mon otona creciente, fi (x ), donde x es el importe a invertir e i el banco en el que se invierte. Dise nad un algoritmo din amico que encuentre la inversi on optima: la cantidad que se debe invertir en cada banco para maximizar los intereses obtenidos.

Yolanda Garc a, Jes us Correas (DSIC - UCM)

16 / 32

Soluci on ejercicio 4. Programaci on din amica


Este problema es muy parecido al anterior, aunque en este caso lo que se debe hacer es maximizar la expresi on f1 (x1 ) + f2 (x2 ) + ... + fn (xn ) con la restricci on: x1 + x2 + ... + xn = Cant Como en el caso anterior, vamos a intentar encontrar una expresi on recurrente respecto al n umero de bancos considerados Representamos con I (i , j ) al inter es m aximo al invertir la cantidad j en los primeros i bancos: I (i , j ) = f1 (x1 ) + f2 (x2 ) + ... + fi (xi ) con la restricci on x1 + x2 + ... + xi = j . Se verica el principio del optimo: si I (i , j ) es el inter es m aximo para i bancos, entonces I (i 1, j xi ) es el inter es m aximo para i 1 bancos (se verica para cualquier n umero de bancos menor a i ) Por tanto, la expresi on recurrente resultante es: f1 (j ) si i = 1 I (i , j ) = m ax (I (i 1, j t ) + fi (t )) en otro caso
0t j
Yolanda Garc a, Jes us Correas (DSIC - UCM) 17 / 32

Soluci on ejercicio 4. Programaci on din amica (cont.)

Podemos considerar que las funciones fi (x ) se proporcionan como valores de una matriz F [1..n, 0..Cant ], donde F [i , j ] contiene el importe de los intereses que proporciona el banco i al invertir la cantidad j Como estructura de datos intermedia, utilizamos una matriz I [1..n, 0..Cant ] Dada la estructura de la recurrencia, se puede generar la matriz I por las

Yolanda Garc a, Jes us Correas (DSIC - UCM)

18 / 32

Soluci on ejercicio 4. Programaci on din amica (cont.)


fun intereses(F[1..n,0..Cant],Cant) crear I[1..n,0..Cant] desde i 1 hasta n hacer I[i,0] 0 n desde desde j 1 hasta Cant hacer I[1,j] F[1,j] n desde desde i 2 hasta n hacer desde j 1 hasta Cant hacer I[i,j] F[i,j] desde t 0 hasta j-1 hacer si I[i,j] < I[i-1,j-t]+F[i,t] entonces I[i,j] I[i-1,j-t]+F[i,t] n si n desde n desde n desde devolver I[n,Cant] n fun
Yolanda Garc a, Jes us Correas (DSIC - UCM)

Falta la obtenci on de los importes invertidos en cada uno de los bancos C omo podr a incluirse en este algoritmo?

19 / 32

Ejercicio 5. Programaci on din amica


[GV00] Subsecuencia com un m axima. Dada una secuencia X = {x1 x2 ... xm }, se dice que Z = {z1 z2 ... zk } (k m) es una subsecuencia de X si existe una secuencia creciente de ndices de X {i1 i2 ... ik } tales que para todo j = 1, 2...k , xij = zj . Dadas dos secuencias X e Y , Z es una subsecuencia com un de X e Y si es subsecuencia de X y subsecuencia de Y . Determinar utilizando programaci on din amica la subsecuencia de longitud m axima com un a X e Y. Ejemplo1 : dadas X = {A, B , C , B , D , A, B } e Y = {B , D , C , A, B , A}, la secuencia {B , C , A} es una subsecuencia comun de ambas. Las secuencias {B , C , B , A} y {B , D , A, B } son subsecuencias comunes de m axima longitud.
1 http://webdiis.unizar.es/kftricas/Asignaturas/ea/Ejercicios/4EjProgramacionDinamica.pdf Yolanda Garc a, Jes us Correas (DSIC - UCM) 20 / 32

Soluci on ejercicio 5. Programaci on din amica


Las secuencias de entrada son X = {x1 x2 ... xm } e Y = {y1 y2 ... yn } Llamaremos L(i , j ) a la longitud de la secuencia com un m axima de Xi e Yj , siendo estas los prejos de X e Y de longitudes i y j , respectivamente:
Xi = {x1 x2 ... xi } Yj = {y1 y2 ... yj }

Se cumple el principio de optimalidad?

Yolanda Garc a, Jes us Correas (DSIC - UCM)

21 / 32

Soluci on ejercicio 5. Programaci on din amica


Las secuencias de entrada son X = {x1 x2 ... xm } e Y = {y1 y2 ... yn } Llamaremos L(i , j ) a la longitud de la secuencia com un m axima de Xi e Yj , siendo estas los prejos de X e Y de longitudes i y j , respectivamente:
Xi = {x1 x2 ... xi } Yj = {y1 y2 ... yj }

Se cumple el principio de optimalidad? En cada paso del algoritmo, podemos decidir si el u ltimo car acter de Xi e Yj forma parte de la secuencia com un m axima:
Si el u ltimo car acter de ambas secuencias es igual, entonces se a nade a la secuencia com un m axima: en este caso, L(i , j ) tiene el siguiente valor: L(i 1, j 1) + 1 Si el u ltimo car acter de Xi e Yj no es igual, entonces la secuencia com un m axima no lo contiene, y el valor de L(i , j ) ser a el mayor de L(i , j 1) y L(i 1, j )
21 / 32

Yolanda Garc a, Jes us Correas (DSIC - UCM)

Soluci on ejercicio 5. Programaci on din amica (cont.)

Por tanto, la expresi on recurrente es: si i = 0 o j = 0 0 L(i 1, j 1) + 1 si i = 0, j = 0, xi = yj L(i , j ) = m ax(L(i , j 1), L(i 1, j )) si i = 0, j = 0, xi = yj Qu e elemento de la tabla de c alculos intermedios contiene la longitud de la subsecuencia com un m axima? C omo ser a la implementaci on de esta recurrencia? C omo se puede obtener la subsecuencia com un m axima?

Yolanda Garc a, Jes us Correas (DSIC - UCM)

22 / 32

Ejercicio 6. Programaci on din amica


[ITIS/ITIG, Feb 2006] Nicanor Cienfuegos quiere impresionar a su novia. Ha decidido gastarse todo su dinero en ores. Seg un los criterios est eticos de Nicanor el ramo ideal es aquel que minimiza el n umero de ores. Dado el prestigio de la orister a, piensa que para cada tipo de or pueden vender un n umero innito de copias. Ante la cara de asombro de su novia Nicanor recapacita, quiz as no fue correcta su suposici on. Mediante programaci on din amica, dise nad dos algoritmos que resuelvan el problema detallando lo siguiente: Suposici on 1: n umero innito de copias (2 puntos):
Estructura de datos intermedia. Relaci on recursiva entre casos y subcasos. Implementaci on del c odigo.

Suposici on 2: n umero nito de copias (2 puntos):


Estructura de datos intermedia. Relaci on recursiva entre casos y subcasos. Implementaci on del c odigo.
Yolanda Garc a, Jes us Correas (DSIC - UCM) 23 / 32

Soluci on ejercicio 6. Programaci on din amica


Este problema es muy parecido al de la devoluci on del cambio: hay que minimizar el n umero de ores, sin sobrepasar otra medida (el precio total) La diferencia est a en que en este caso puede darse la situaci on de que no se gaste exactamente el dinero disponible, sino algo menos Para que el gasto sea lo m as pr oximo a la cantidad disponible, debemos considerarlas en orden creciente de precio. Denominamos pi al precio de la or i , p1 p2 ... pn As , el importe no gastado ser a inferior a p1 Con C (i , j ) se representa el n umero m nimo de ores de 1 a i que se pueden utilizar para gastar la cantidad j de dinero La expresi on de la recurrencia es:
+ si j < 0 0 si j = 0 C (i , j ) = j / p si i =1y j >0 1 m n(C (i 1, j ), 1 + C (i , j pi )) en otro caso

Yolanda Garc a, Jes us Correas (DSIC - UCM)

24 / 32

Soluci on ejercicio 6. Programaci on din amica (cont.)


En la recurrencia anterior se ha considerado que se puede elegir cualquier n umero de ores de cada tipo (la expresi on 1 + C (i , j pi ) permite volver a seleccionar el mismo tipo de or indenidamente) Si no hay un n umero ilimitado de ores, la recurrencia debe considerar el n umero m aximo de ores disponible por cada tipo Denominamos fi al n umero de ores del tipo i La expresi on de la recurrencia pasa a ser la siguiente:
+ 0 j /pi C (i , j ) = f i n {k + C (i 1, j k pi )} m
0k fi

si j < 0 si j = 0 si i = 1 y j pi fi si i = 1 y j > pi fi () en otro caso

(*) Podemos considerar que compramos todas las ores de la tienda y adem as nos sobra dinero La especicaci on del algoritmo es similar a las vistas en casos anteriores
Yolanda Garc a, Jes us Correas (DSIC - UCM) 25 / 32

Ejercicio 7. Programaci on din amica


[ITIS/ITIG, feb 2008] A Nicanor Cienfuegos le han hecho un regalo. Como no le gusta ha decidido cambiarlo por otros productos. Su cambio ideal es el siguiente: el valor de los productos tiene que ser igual al valor del regalo o superarlo de forma m nima. No le importa tener varias copias del mismo producto. Suponiendo conocidos los productos de la tienda, sus precios y el n umero de unidades de cada producto: a) (3 puntos) Dise na un algoritmo din amico que determine el valor de los productos elegidos en el canje, detallando La estructura de c alculos intermedios, La relaci on recursiva, y La funci on o procedimiento que implemente este algoritmo. b) (1 punto) Proporciona una funci on con memoria que implemente este algoritmo.

Yolanda Garc a, Jes us Correas (DSIC - UCM)

26 / 32

Soluci on ejercicio 7. Programaci on din amica


Este ejercicio es una combinaci on de otros dos vistos en clase: cambio de moneda con un n umero limitado de monedas (feb 07), y el nutricionista (jun 07). La suma de los valores de los productos debe ser igual o superior (de forma m nima) a la cantidad de dinero disponible Existe un n umero limitado de objetos de cada tipo en la tienda Estructura para c alculos intermedios una tabla C [1..N , 0..R ], donde N es el n umero de tipos de objetos en la tienda, y R es el valor del regalo a cambiar La relaci on recursiva es la siguiente (pi es el precio unidades del objeto i ): 0 j /pi pi C (i , j ) = + n (pi k + C [i 1, j pi k ]) m
0k Ki

y ui el n umero de si j 0 si i = 1 y j pi ui si i = 1 y j > pi ui en otro caso

donde Ki = m n(ui , j /pi ).


Yolanda Garc a, Jes us Correas (DSIC - UCM) 27 / 32

Soluci on ejercicio 7. Programaci on din amica (cont.)


fun regalos(p[1..N], u[1..N],Cant) crear C[1..N,0..Cant] desde i 1 hasta N hacer C[i,0] 0 desde i 1 hasta N hacer desde j 1 hasta Cant hacer si i=1 entonces si j/p[i] u[i] entonces C[i,j] j/p[i] *p[i] si no C[i,j] + si no min + desde k 0 hasta m n( j/p[i] , u[i]) hacer si k*p[i]>j entonces min m n(min,k*p[i]) si no min m n(min,k*p[i]+C[i-1,j-k*p[i]]) n desde C[i,j] min n si n desde n desde devolver C[N,Cant] n fun
Yolanda Garc a, Jes us Correas (DSIC - UCM) 28 / 32

Soluci on ejercicio 7. Programaci on din amica (cont.)


Una posible soluci on para el apartado b) es la siguiente:
//C[1..N,1..Cant] es una tabla global con valor inicial -1 fun regalos mem(p[1..N], u[1..N],i,j) si j0 entonces devolver 0 si C[i,j]0 entonces devolver C[i,j] si i=1 entonces si j/p[1] u[1] entonces C[1,j] j/p[1] *p[1] si no C[i,j] + si no min + desde k 0 hasta m n( j/p[i] , u[i]) hacer aux k*p[i]+regalos mem(p,u,i-1,j-k*p[i]) si min > aux entonces min aux n desde C[i,j] min n si devolver C[i,j] n fun
Yolanda Garc a, Jes us Correas (DSIC - UCM) 29 / 32

Ejercicio 8. Programaci on din amica


[ITIS/ITIG, Jun 2008] Una Organizaci on No Gubernamental dispone de un fondo para la nanciaci on de proyectos de ayuda, y se quiere nanciar la realizaci on del m aximo n umero de proyectos posible. Para ello, se dispone de una serie de tipos de proyecto diferentes, con la siguiente informaci on disponible: Presupuesto del tipo de proyecto, pi N umero de regiones en las que se puede realizar, ri Mediante la t ecnica de programaci on din amica, dise na un algoritmo que permita determinar cu antos proyectos se pueden realizar sin superar el importe total del fondo, indicando lo siguiente:
1 2 3

Estructura de datos intermedia (0,5 puntos) Relaci on recursiva entre casos y subcasos (1 punto) C odigo del algoritmo (3,5 puntos)
30 / 32

Yolanda Garc a, Jes us Correas (DSIC - UCM)

Soluci on ejercicio 8. Programaci on din amica


1) La estructura de datos intermedia es una tabla C [1..n, 0..fondo ] con tantas las como tipos de proyectos, ordenados en orden creciente de presupuesto, y tantas columnas como el importe del fondo. C [i , j ] representa el n umero m aximo de proyectos (entre los i primeros tipos de proyecto) que se pueden nanciar con un importe j . 2) La relaci on recursiva entre casos y subcasos es 0 j /pi C (i , j ) = ri m ax {k + C (i 1, j k pi )}
0k ri

la siguiente: si j < 0 si j = 0 si i = 1 y j pi ri si i = 1 y j > pi ri en otro caso

donde pi es el presupuesto del proyecto i , p1 p2 ... pn , y ri es el n umero de regiones en las que se puede realizar el proyecto.
Yolanda Garc a, Jes us Correas (DSIC - UCM) 31 / 32

Soluci on ejercicio 8. Programaci on din amica (cont.)


fun ong(p[1..n],r[1..n],Fondo) crear C[1..n,0..Fondo] desde pr 1 hasta n hacer C[pr,0] 0 desde impte 1 hasta Fondo hacer si pr=1 impte p[1]*r[1] entonces C[pr,impte] impte/p[1] si no si pr=1 entonces C[pr,impte] r[1] si no C[pr,impte] 0 desde k 0 hasta m n(r[pr], impte/p[pr] ) hacer si C[pr,impte] < k+C[pr-1,impte-k*p[pr]] entonces C[pr,impte] k+C[pr-1,impte-k*p[pr]] n si n desde n si n desde n desde devolver C[n,Fondo] n fun
Yolanda Garc a, Jes us Correas (DSIC - UCM) 32 / 32

También podría gustarte