Suponemos que tenemos una mochila donde podemos meter hasta 15 kilos, y tenemos los siguiente items:
Item | peso | valor |
---|---|---|
1 | 13 | 50 |
2 | 11 | 40 |
3 | 8 | 35 |
4 | 7 | 30 |
5 | 3 | 15 |
6 | 2 | 5 |
Sea \(K(W)\) el valor óptimo de la mochila con restricción de peso \(W\), entonces se tiene: \[ K(W) = \max\{K(W-w_i) + v_i\}. \]
El dag del problema de la mochila, ¿a qué problema es equivalente en los DAGs?
Se define la siguiente cantidad: \[ K(W,j) = \text{máximo valor utilizando solamente los items de 1 a j sin repetir}. \]
\[ K(W,j) = \max\{K(W-w_j,j-1)+ v_j,K(W,j-1)\}. \]
Memoization es una técnica que, lo que hace es guardar en memoria resultados intermedios para no tener que calcularlos.
Knapsack(w): if w in hash_table: return hash_table(w) K(w) = max(K(w-w_i)+ v_i: w_i<=w) insert w in hash_table return K(w)
Figura 1: Árbol parcial de llamadas
Suponer que, nos dan un grafo y nos piden que hallemos los caminos más cortos con la restricción de que los cáminos tienen que tener menos de \(\ell\) aristas, rellenar la siguiente propiedad: \[ dist(v,i) = \dots \] ¿Cúal es el valor que debemos poner con \(dist(v,0)\)?
Idea:
Definid \(dist(i,j,k)\) sea la distancia mínima de \(i\) a \(j\) pasando por nodos intermedios \(1,\ldots, k\). Ahora, la recursión es \[ dist(i,j,k) = \min\{dist(i,k,k-1)+dist(k,j,k-1),dist(i,j,k-1)\} \]
La cantidad de memoria necesaria es a lo sumo:
Dado un grafo, se llama un conjunto independiente es un conjunto de nodos que no tienen un eje entre ellos.
Figura 2: Ejemplo de grafo con un conjunto independiente
Sea \(I(u)\) el tamaño máximo de un conjunto independiente, entonces tenemos:
Figura 3: Árbol para calcular el tamaño máximo