Ho trovato un problema in cui l'obiettivo era utilizzare la programmazione dinamica (anziché altri approcci). C'è una distanza da misurare e una serie di cavi di diversa lunghezza. Qual è il numero minimo di cavi necessari per coprire esattamente la distanza?
Per me questo sembrava un problema nello zaino , ma dal momento che potevano esserci multipli di una lunghezza particolare, era un problema dello zaino limitato, piuttosto che un problema dello zaino 0/1. (Tratta il valore di ogni oggetto come il suo peso.) Prendendo l'approccio naif (e senza preoccuparsi 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, ciò porta a risultati non ottimali.
Ad esempio, cavi dati:
1 x 10 piedi,
1 x 7 piedi,
1 x 6 piedi,
5 x 3 piedi,
6 x 2 piedi,
7 x 1ft
Se l'intervallo target è 13ft, l'algoritmo DP preleva 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 cerca di coprire 15 piedi. L'algoritmo DP ha finito per selezionare 6 + 3 + 3 + 3 per ottenere 4 cavi, mentre l'algoritmo greedy sceglie correttamente 10 + 3 + 2 per soli 3 cavi.
Ad ogni modo, facendo una leggera scansione della conversione delimitata 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 aggiunge al numero di elementi multipli. Ad esempio: ho 5 cavi da 3 piedi. Non riesco molto bene ad aggiungere {3, 2x3, 4x3} perché 3 + 2x3 + 4x3 > 5x3. Dovrei aggiungere {3, 4x3} invece?
[Attualmente sto cercando di ingannare il documento "Oregon Trail Knapack Problem", ma al momento sembra che l'approccio utilizzato non sia la programmazione dinamica.]