Ho riscontrato un problema in cui l'obiettivo era utilizzare la programmazione dinamica (anziché altri approcci). C'è una distanza da percorrere e una serie di cavi di diverse lunghezze. Qual è il numero minimo di cavi necessari per coprire esattamente la distanza?
Per me questo sembrava un problema con lo zaino , ma poiché potevano esserci multipli di una lunghezza particolare, si trattava di un problema con lo zaino limitato, piuttosto che un problema con lo zaino 0/1. (Considera il valore di ogni articolo come il suo peso.) Prendendo l'approccio ingenuo (e non preoccupandomi dell'espansione dello spazio di ricerca), il metodo che ho usato per convertire il problema dello zaino limitato in un problema dello zaino 0/1, era semplicemente suddividere i multipli in singoli e applicare il noto algoritmo di programmazione dinamica. Sfortunatamente, questo porta a risultati non ottimali.
Ad esempio, dati forniti:
1 x 10 piedi,
1 x 7 piedi,
1 x 6 piedi,
5 x 3 piedi,
6 x 2 piedi,
7 x 1 piedi
Se l'intervallo di destinazione è 13 piedi, l'algoritmo DP seleziona 7 + 6 per coprire la distanza. Un algoritmo avido avrebbe scelto 10 + 3, ma è un pareggio per il numero minimo di cavi. Il problema sorge quando si tenta di estendere 15 piedi. L'algoritmo DP ha finito per raccogliere 6 + 3 + 3 + 3 per ottenere 4 cavi, mentre l'algoritmo greedy prende correttamente 10 + 3 + 2 per soli 3 cavi.
Ad ogni modo, facendo una leggera scansione della conversione limitata a 0/1, sembra il noto approccio per convertire più elementi in {p, 2p, 4p ...}. La mia domanda è: come funziona questa conversione se p + 2p + 4p non si somma al numero di più elementi. Ad esempio: ho 5 cavi da 3 piedi. Non riesco molto ad aggiungere {3, 2x3, 4x3} perché 3 + 2x3 + 4x3> 5x3. Devo aggiungere invece {3, 4x3}?
[Attualmente sto cercando di scrivere il documento "Oregon Trail Knapsack Problem", ma al momento sembra che l'approccio usato non sia la programmazione dinamica.]