У меня очень мало опыта в динамическом программировании. Я использовал его для решения проблемы выравнивания ДНК, проблемы с основным рюкзаком и простой проблемы с поиском путей. Я понял, как они работают, но пока я не чувствую себя абсолютно комфортно.Могу ли я использовать динамическое программирование для решения этой проблемы?
У меня есть проблема, которая напоминает мне о динамическом программировании 0-1, но различия меня отбросили, и я не уверен, могу ли я по-прежнему использовать эту технику, или если мне придется согласиться на рекурсивный подход ,
Предположим, у меня есть список предметов, каждый из которых имеет разные значения, вес и стоимость. Может быть более одного элемента.
Предположим, мне нужно выбрать комбо из тех предметов, которые являются самыми ценными, но остается в пределах веса и стоимости. До сих пор я описал проблему с рюкзаком, в значительной степени, с двумя ограничениями. Но вот разница:
Значение выбранного элемента изменяется в зависимости от того, сколько из них у меня есть в комбо.
Предположим, что каждый элемент имеет связанную с ним функцию, что говорит мне, какая группа этих предметов стоит мне. Это базовая линейная функция, такая как value_of_item = -3 (количество этого предмета) + 50
Так что, если у меня есть один элемент в комбо, то для меня это значение 47. Если бы у меня было 2 их, тогда они всего лишь 44 для меня.
Если я использую для этого таблицу динамического программирования, то для каждой ячейки мне придется отступить, чтобы увидеть, находится ли этот элемент в текущей комбо, что делает DP бессмысленным. Но, возможно, есть способ переделать проблему, чтобы я мог использовать DP.
Надеюсь, это имело смысл.
Альтернатива заключается в том, чтобы генерировать каждую комбинацию предметов, в пределах стоимости и веса, фигурировать значение каждого комбо, выбирать наиболее ценное комбо. Для списка из 1000 предметов даже это будет дорогой поиск, и это то, что я буду рассчитывать многократно. Я бы хотел найти способ использовать преимущества DP.
Характер DP должен выполнять вычисления, а затем позволить быстрый поиск этого результата для будущих вычислений , Для этого требуется сопоставление между некоторым уникальным числом, представляющим условия ввода, и рассчитанной стоимостью для этого набора условий. Если у меня есть 2Red и 3Green и 4Blue, я могу однозначно указать все возможные комбинации: r = # красного, g = # зеленого, b = # синего, id = r * (3 * 4) + g * 4 + b. Я могу использовать id для поиска кэшированных вычислений. – Speed8ump