Вы должны быть в состоянии расширить стандартную задачу динамического программирования с одним ограничением, чтобы обработать два или более ограничений.
Как напоминание, стандартное решение DP для задачи о ранце работает, упорядочивая элементы в некотором порядке, затем отвечая на все вопросы следующего вида:
Какое максимальное значение можно получить, используя первые элементы i, не превышая вес w?
Это превращается в2D-таблица с одной осью для количества рассматриваемых предметов и другой для различных возможных значений веса.Чтобы заполнить таблицу, вы заполняете 1D срез записей, где i = 0, устанавливая их в ноль (вы не можете получить никакого значения, если у вас нет элементов), затем заполняете 1D срез, где i = 1, рассматриваявключать или исключать первый элемент, срез, где i = 2, учитывая, включать или исключать второй элемент и т. д. Тогда время выполнения составляет O (nW), где n - количество элементов, а W - максимально допустимоевес, поскольку это размеры таблицы, и вы выполняете O (1) работу для каждой записи.
Если у вас теперь есть два ограничения (вес и объем), вы можете решить все проблемы следующей формы:
Какое максимальное значение можно получить, используя первые элементы i, не превышая вес w или объем v?
Это превращается в трехмерную таблицу с одной осью длясколько предметов рассматривается, другой для различных возможных значений веса и третий для возможных значений объема.Чтобы заполнить таблицу, вы заполняете 2D-срез записей, где i = 0, устанавливая их в ноль (вы не можете получить никакого значения, если у вас нет элементов), а затем заполняете 2D-срез, где i = 1, с учетомвключать или исключать первый элемент, срез, где i = 2, принимая во внимание, включать или исключать второй элемент и т. д. Время выполнения - O (nWV), где n - количество элементов, W - максимально допустимый вес, а V - максимально допустимое значение, поскольку это число записей в таблице, и для заполнения каждого из них требуется O (1).
Видите ли вы, как адаптировать это для большего числа ограничений?