Я зіткнувся з проблемою, де метою було використання динамічного програмування (замість інших підходів). Існує відстань, яку потрібно прокласти, і набір кабелів різної довжини. Яка мінімальна кількість кабелів, необхідних для точного проходження відстані?
Для мене це виглядало як проблема з рюкзаком , але, оскільки може бути множин певної довжини, це була проблема обмеженого рюкзака, а не проблема рюкзака 0/1. (Оцінюйте значення кожного предмета як його вагу.) Прийнявши наївний підхід (і не піклуючись про розширення пошукового простору), метод, який я використовував для перетворення обмеженої проблеми рюкзака в проблему рюкзака 0/1, був просто розбийте кратні на сингли та застосуйте відомий алгоритм динамічного програмування. На жаль, це призводить до неоптимальних результатів.
Наприклад, дані кабелі:
1 х 10
футів , 1 х 7 футів,
1 х 6 футів,
5 х 3 фути ,
6 х 2
фути , 7 х 1 фут
Якщо цільовий проміжок дорівнює 13 футів, алгоритм DP вибирає 7 + 6 для проходження відстані. Жадібний алгоритм вибрав би 10 + 3, але це прив'язка до мінімальної кількості кабелів. Проблема виникає при спробі перейти на 15 футів. Алгоритм DP підбирав 6 + 3 + 3 + 3 для отримання 4 кабелів, тоді як жадібний алгоритм правильно підбирає 10 + 3 + 2 лише для 3-х кабелів.
У будь-якому випадку, провівши легке сканування перетворень, обмежених 0/1, здається, добре відомий підхід перетворення декількох елементів у {p, 2p, 4p ...}. Моє запитання - як працює ця конверсія, якщо p + 2p + 4p не додає до кількості кількох елементів. Наприклад: у мене є 5 кабелів 3 фути. Я не можу дуже добре додати {3, 2x3, 4x3}, тому що 3 + 2x3 + 4x3> 5x3. Чи слід додати замість {3, 4x3}?
[На даний момент я намагаюся розглянути папір "Проблема штату Орегон Тракс", але зараз виглядає так, що підхід, який застосовується там, не є динамічним програмуванням.