You are on page 1of 2

11.- Nos vamos de compras al mercado.

Tenemos K euros en el bolsillo y una lista de m productos que


podemos comprar. Cada producto tiene un precio, pi (que será siempre un número entero), y una utilidad,
ui. De cada producto podemos comprar como máximo 3 unidades. Además, tenemos una oferta según la
cual la segunda unidad nos cuesta 1 euro menos, y la tercera 2 euros menos. Queremos elegir los
productos a comprar, maximizando la utilidad de los productos comprados. Resolver el problema por
programación dinámica, indicando la ecuación recurrente, con sus casos base.

Solución:

La solución del problema se simplifica si pensamos que la decisión a tomar es comprar, nada, 1, 2 o 3
veces un mismo producto, por lo que la ecuación a resolver toma la forma de COMPRAR(i,k): ENTERO,
donde i significa comprar los primeros i objetos y dinero k. Lo definiremos recursivamente, como:

- ∞ si (k<0) o (i<0)
Comprar (i,k) = 0 si no se cumple la anterior y si (k= 0) o (i=0)
Máximo {comprar (i-1,k), ui+comprar(i-1,k- pi), 2ui+comprar(i-1,k-2pi+1),
3ui+comprar(i-1,k-3pi+2)}

La ecuación a resolver tiene 2 parámetros, luego usaremos una tabla bidimensional, definida de la
siguiente forma: T : array[0..m, 0..K] de entero

El algoritmo para rellenarla será:

for(i= 0, i<=m, i++){


for(j= 0,j<=K,j++){
if ((i == 0) or (j == 0))
{
T[i, j]=0;
}
else
{
T[i, j]= max(T[i-1, j], ui+T[i-1, j-pi], 2ui+T[i-1, j-2pi+1], 3ui+T[i-1, j-3pi+2])
}
return(T[m, K])

Parte verde: es una función decisoria que nos dice, si i (i es la cantidad de productos en lista... o sea m. En
caso de que m sea 0, entonces el valor de la solución será 0 también. O sea, funciona como caso base
también. El j indica la cantidad de plata, o sea K, si el K es igual a 0, tampoco podemos comprar nada, por
lo que la solución también será 0.)
Parte azul: es una función maximizadora. Elige de entre los máximos que ya habían hacia atrás, o sea la
posibilidades son...:
1-T[i-1, j] si no compramos el producto i, pues conservamos la utilidad que ya teniamos cuando habíamos
comprado el producto i-1, i-2, i-3... 1.
2-Otro caso es comprar un producto, por lo cual la utilidad se saca sumando la utilidad de un producto i
comprado, sumándole la utilidad que ya teníamos anteriormente, o sea: ui+T[i-1, j-pi]. Donde (i-1)
representa al producto anterior y el (j-pi) representa el valor del dinero que tenemos menos el precio del
producto i.
3-El tercer caso es comprar dos productos i. Si compramos dos productos i, la utilidad nueva será la
utilidad que teníamos antes más dos veces la utilidad de i, o sea: 2ui+T[i-1, j-2pi+1], donde ui es la
utilidad del producto i, así que la multiplicamos por dos, y i-1, T[i-1, j-2pi+1], representa la utilidad
anterior, donde (i-1) representa al producto anterior u el j-2pi+1, era el dinero que nos quedaba menos dos
veces el precio del producto i (llamado pi), mas 1 euro, pues si compramos dos productos iguales, nos
descuentan un euro.
4-La cuarta opción es comprar 3 veces el producto i. La utilidad que nos reporta hacer esta transacción es
igual a 3ui+T[i-1, j-3pi+2]), 3 veces la utilidad del producto i (3*ui), más la utilidad anterior, que está
representada por: T[i-1, j-3pi+2], donde (i-1) representa al producto anterior y j-3pi+2, donde j era la
cantidad de plata que ya teníamos menos 3 veces el precio de i mas 2 euros, por lo mismo anterior.
El problema termina cuando i=0, que quiere decir que se nos acabaron los productos o cuando j= 0, se nos
acabó la plata.
Parte roja: el doble for es para revisar todos los j y todos los i, puesto que la respuesta final depende de la
mayor utilidad, sujeta al precio y no a la mayor cantidad de productos, por lo que la mayor utilidad se
podría obtener con el primer producto, si su utilidad es mucho muy grande. También podría pasar que
compramos desde el producto 2 en adelante, y la solución se encuentra comprando hasta el producto 11, o
compramos desde el 5 en adelante.... etc. por tanto, no solo tenemos que maximizar hacia atrás los
productos, sino que también podemos darle un tope de productos, comprar desde 4 hacia atrás, desde el 8
hacia atrás, o los compramos todos, desde el m (que es igual a i), hacia atrás, etc. Resumen: for del i, nos
asegura que combinemos todos los productos posibles.
El segundo for nos asegura que revisemos todos los presupuestos posibles. Podríamos tener una solución
óptima gastando menos del presupuesto total.

You might also like