30 lines
762 B
Python
30 lines
762 B
Python
def thief_knapsack(weights, values, M, K):
|
|
cap = M * K
|
|
n = len(weights)
|
|
dp = [0] * (cap + 1)
|
|
take = [[False] * (cap + 1) for _ in range(n)]
|
|
for i in range(n):
|
|
w = weights[i]
|
|
v = values[i]
|
|
for c in range(cap, w - 1, -1):
|
|
if dp[c - w] + v > dp[c]:
|
|
dp[c] = dp[c - w] + v
|
|
take[i][c] = True
|
|
c = cap
|
|
items = []
|
|
for i in range(n - 1, -1, -1):
|
|
if take[i][c]:
|
|
items.append(i)
|
|
c -= weights[i]
|
|
items.reverse()
|
|
return dp[cap], items
|
|
|
|
|
|
if __name__ == "__main__":
|
|
weights = [2, 3, 4, 5, 9, 7, 3]
|
|
values = [3, 4, 5, 8, 10, 7, 6]
|
|
M = 2
|
|
K = 10
|
|
best, items = thief_knapsack(weights, values, M, K)
|
|
print(best, items)
|