Me encontré con un problema en el que el objetivo era usar programación dinámica (en lugar de otros enfoques). Hay una distancia a recorrer y un conjunto de cables de diferentes longitudes. ¿Cuál es el número mínimo de cables necesarios para recorrer la distancia exactamente?
Para mí, esto parecía un problema de mochila , pero dado que podría haber múltiplos de una longitud particular, era un problema de mochila limitado, en lugar de un problema de mochila 0/1. (Trate el valor de cada elemento como su peso). Tomando el enfoque ingenuo (y sin importar la expansión del espacio de búsqueda), el método que usé para convertir el problema de la mochila acotada en un problema de mochila 0/1, fue simplemente divida los múltiplos en singles y aplique el conocido algoritmo de programación dinámica. Desafortunadamente, esto lleva a resultados subóptimos.
Por ejemplo, cables dados:
1 x 10 pies,
1 x 7
pies, 1 x 6 pies,
5 x 3 pies,
6 x 2 pies,
7 x 1 pies
Si el alcance objetivo es 13 pies, el algoritmo DP elige 7 + 6 para abarcar la distancia. Un algoritmo codicioso habría elegido 10 + 3, pero es un empate para un número mínimo de cables. El problema surge cuando se trata de abarcar 15 pies. El algoritmo DP terminó eligiendo 6 + 3 + 3 + 3 para obtener 4 cables, mientras que el algoritmo codicioso elige correctamente 10 + 3 + 2 para solo 3 cables.
De todos modos, haciendo un escaneo ligero de conversión limitado a 0/1, parece ser el enfoque bien conocido para convertir múltiples elementos a {p, 2p, 4p ...}. Mi pregunta es cómo funciona esta conversión si p + 2p + 4p no se suma al número de elementos múltiples. Por ejemplo: tengo 5 cables de 3 pies. No puedo agregar {3, 2x3, 4x3} porque 3 + 2x3 + 4x3> 5x3. ¿Debo agregar {3, 4x3} en su lugar?
[Actualmente estoy tratando de asimilar el documento "Oregon Trail Knapsack Problem", pero actualmente parece que el enfoque utilizado no es una programación dinámica.]