Оптимальный способ наполнения 2 рюкзаков?
алгоритм динамического программирования для оптимального заполнения рюкзака хорошо работает в случае одного рюкзака. Но есть ли эффективный известный алгоритм, который оптимально заполнит 2 рюкзака (емкости могут быть неравными)?
Я пробовал следующие два способа и ни один из них не является правильным.
- сначала заполните первый рюкзак, используя оригинальный алгоритм DP, чтобы заполнить один рюкзак, а затем заполнить другой рюкзак.
- сначала заполните рюкзак размера W1 + W2, а затем разделить решение на два решения (где W1 и W2-емкости двух рюкзаков).
постановка задачи (см. также Проблема С Рюкзаком в Википедии):
мы должны заполнить рюкзак набором элементов (каждый элемент имеет вес и значение), чтобы максимизировать значение, которое мы можем получить от элементов, имея общий вес меньше или равен размеру рюкзака.
мы не можем использовать элемент несколько раз.
- мы не можем использовать часть товара. Мы не можем взять часть предмета. (Каждый элемент должен быть полностью включен или нет).
3 ответов
Я буду считать каждый из n
элементы могут использоваться только один раз, и вы должны максимизировать свою прибыль.
оригинальный рюкзак это dp[i] = best profit you can obtain for weight i
for i = 1 to n do
for w = maxW down to a[i].weight do
if dp[w] < dp[w - a[i].weight] + a[i].gain
dp[w] = dp[w - a[i].weight] + a[i].gain
теперь, поскольку у нас есть два рюкзака, мы можем использовать dp[i, j] = best profit you can obtain for weight i in knapsack 1 and j in knapsack 2
for i = 1 to n do
for w1 = maxW1 down to a[i].weight do
for w2 = maxW2 down to a[i].weight do
dp[w1, w2] = max
{
dp[w1, w2], <- we already have the best choice for this pair
dp[w1 - a[i].weight, w2] + a[i].gain <- put in knapsack 1
dp[w1, w2 - a[i].weight] + a[i].gain <- put in knapsack 2
}
сложность времени O(n * maxW1 * maxW2)
, где maxW
максимальный вес рюкзак может снести. Обратите внимание, что это не очень эффективно, если емкости большие.
исходный DP предполагает, что вы отмечаете в массиве dp, что значения, которые вы можете получить в рюкзаке, и обновления выполняются, следовательно, учитывая элементы.
В случае 2 рюкзаков вы можете использовать 2-мерный динамический массив, поэтому dp[ i ][ j] = 1 когда вы можете положить вес Я к первому и весу j на второй рюкзак. Обновление похоже на оригинальный случай DP.
рекурсивная формула-это кто-нибудь смотрит:
учитывая n элементов, таких, что элемент i имеет вес wi и значение pi. Две котомки и havk мощности W1 и W2.
для каждого 0
для A
формула: M[i, a, b] = max{M[i-1,a,b], M[i-1,A-wi,b] + pi, M[i-1,a,b-wi] + pi}
все решение проблемы с I элементы либо имеет элемент i в рюкзаке 1, в рюкзаке 2, или ни в одном из них.