получить элемент списка в рюкзаке 0-1

avatar
amir_rj
8 апреля 2018 в 07:38
1295
2
0

У меня есть этот код на Python, решающий проблему рюкзака с помощью динамического программирования. эта функция возвращает общую стоимость лучшего подмножества, но я хочу, чтобы она возвращала элементы лучшего подмножества. кто-нибудь может помочь мне с этим?

def knapSack(W, wt, val, n):
    K = [[0 for x in range(W + 1)] for x in range(n + 1)]

    # Build table K[][] in bottom up manner
    for i in range(n + 1):
        for w in range(W + 1):
            if i == 0 or w == 0:
                K[i][w] = 0
            elif wt[i - 1] <= w:
                K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1] [w])
            else:
                K[i][w] = K[i - 1][w]

    return K[n][W]


val = [40, 100, 120,140]
wt = [1, 2, 3,4]
W = 4
n = len(val)
print(knapSack(W, wt, val, n))
Источник

Ответы (2)

avatar
Todd Burus
18 июля 2018 в 03:06
0

Вы можете добавить этот код в конец своей функции, чтобы вернуться к добавленным элементам:

res = K[n][W]
print(res)

w = W
for i in range(n, 0, -1):
    if res <= 0:
        break

    if res == K[i - 1][w]:
        continue
    else:
        print(wt[i - 1])

        res = res - val[i - 1]
        w = w - wt[i - 1]
avatar
Arka Pal
8 апреля 2018 в 08:03
2

Вы можете вместо возврата только K[n][W] вернуть K Затем повторите K как:

elements=list()
dp=K
w = W
i = n
while (i> 0):
  if dp[w][i] - dp[w - wt(i)][i-1] == val(i):
     #the element 'i' is in the knapsack
     element.append(i)
     i = i-1 //only in 0-1 knapsack
     w -=wt(i)
  else: 
     i = i-1 

Идея заключается в том, чтобы выполнить обратную итерацию матрицы K, чтобы определить, какие значения элементов были добавлены для получения оптимального значения K[W][n].