Я столкнулся с проблемой, когда целью было использование динамического программирования (вместо других подходов). Существует расстояние, которое нужно охватить, и набор кабелей разной длины. Какое минимальное количество кабелей необходимо для точного определения расстояния?
Для меня это выглядело как проблема рюкзака , но, поскольку могли быть кратные определенной длины, это была проблема ограниченного ранца, а не проблема ранца 0/1. (Рассматривайте значение каждого элемента как его вес.) Используя наивный подход (не заботясь о расширении пространства поиска), метод, который я использовал для преобразования ограниченной задачи о ранце в задачу о ранце 0/1, был просто разбейте кратные числа на отдельные и примените известный алгоритм динамического программирования. К сожалению, это приводит к неоптимальным результатам.
Например, приведены кабели:
1 x 10 футов,
1 x 7 футов,
1 x 6 футов,
5 x 3 фута,
6 x 2
фута , 7 x 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} вместо этого?
[В настоящее время я пытаюсь получить документ «Проблема рюкзака в Орегоне», но в настоящее время похоже, что используемый там подход - это не динамическое программирование.]