Оптимальный способ наполнения 2 рюкзаков?

алгоритм динамического программирования для оптимального заполнения рюкзака хорошо работает в случае одного рюкзака. Но есть ли эффективный известный алгоритм, который оптимально заполнит 2 рюкзака (емкости могут быть неравными)?

Я пробовал следующие два способа и ни один из них не является правильным.

  1. сначала заполните первый рюкзак, используя оригинальный алгоритм DP, чтобы заполнить один рюкзак, а затем заполнить другой рюкзак.
  2. сначала заполните рюкзак размера W1 + W2, а затем разделить решение на два решения (где W1 и W2-емкости двух рюкзаков).

постановка задачи (см. также Проблема С Рюкзаком в Википедии):

  1. мы должны заполнить рюкзак набором элементов (каждый элемент имеет вес и значение), чтобы максимизировать значение, которое мы можем получить от элементов, имея общий вес меньше или равен размеру рюкзака.

  2. мы не можем использовать элемент несколько раз.

  3. мы не можем использовать часть товара. Мы не можем взять часть предмета. (Каждый элемент должен быть полностью включен или нет).

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, или ни в одном из них.