Natknąłem się na problem, w którym celem było zastosowanie programowania dynamicznego (zamiast innych podejść). Należy rozstawić odległość i zestaw kabli o różnych długościach. Jaka jest minimalna liczba kabli potrzebnych do dokładnego rozłożenia odległości?
Dla mnie wyglądało to na problem z plecakiem , ale ponieważ mogły istnieć wielokrotności określonej długości, był to problem związany z plecakiem, a nie problem z plecakiem 0/1. (Traktuj wartość każdego przedmiotu jako jego wagę.) Biorąc naiwne podejście (i nie troszcząc się o rozszerzenie przestrzeni poszukiwań), metoda, którą zastosowałem, aby przekształcić problem związany z plecakiem w problem plecaka 0/1, była po prostu podziel wielokrotności na pojedyncze i zastosuj dobrze znany algorytm programowania dynamicznego. Niestety prowadzi to do nieoptymalnych wyników.
Na przykład podane kable:
1 x 10 stóp,
1 x 7 stóp,
1 x 6 stóp,
5 x 3
stopy ,
6 x
2 stopy , 7 x 1 stóp
Jeśli rozpiętość docelowa wynosi 13 stóp, algorytm DP wybiera 7 + 6 w celu ustalenia odległości. Chciwy algorytm wybrałby 10 + 3, ale jest to remis dla minimalnej liczby kabli. Problem pojawia się przy próbie rozciągnięcia na 15 stóp. Algorytm DP ostatecznie wybrał 6 + 3 + 3 + 3, aby uzyskać 4 kable, podczas gdy chciwy algorytm poprawnie wybiera 10 + 3 + 2 tylko dla 3 kabli.
W każdym razie, dokonując lekkiego skanowania konwersji ograniczonej do 0/1, wydaje się, że jest to dobrze znane podejście do konwersji wielu elementów na {p, 2p, 4p ...}. Moje pytanie brzmi, jak działa ta konwersja, jeśli p + 2p + 4p nie sumuje się do liczby wielu elementów. Na przykład: Mam 5 kabli o długości 3 stóp. Nie mogę bardzo dobrze dodać {3, 2x3, 4x3}, ponieważ 3 + 2x3 + 4x3> 5x3. Czy zamiast tego powinienem dodać {3, 4x3}?
[Obecnie próbuję przejrzeć artykuł „Oregon Trail Knapsack Problem”, ale obecnie wygląda na to, że zastosowane podejście nie polega na programowaniu dynamicznym.]