Professional Documents
Culture Documents
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
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.