def greedy_knab(weight, profit, size, capacity, used=None):
if used is None:
used = []
if capacity <= 0:
global path1
path1=used
return 0
max = profit[0]
chosen_one = -1
for i in range(size):
if i not in used and weight[i] <= capacity:
if profit[i] >= max:
max = profit[i]
chosen_one = i
if chosen_one == -1:
path1=used
return 0
used.append(chosen_one)
return profit[chosen_one] + greedy_knab(weight, profit, size, capacity - weight[chosen_one],used)
def dp_knapsack(dp, weight, profit, size, capacity, cur_capacity=0, i=0, sum=0, pick=[]):
global ans, picked
if i >= size:
if i == size and ans < sum:
ans = sum
picked = copy.deepcopy(pick)
return
if dp[i][cur_capacity] != -1 and dp[i][cur_capacity] >= sum:
return
dp[i][cur_capacity] = sum
# leave
dp_knapsack(dp, weight, profit, size, capacity, cur_capacity, i+1, sum, pick)
# pick
if cur_capacity + weight[i] <= capacity:
pick.append(i)
dp_knapsack(dp, weight, profit, size, capacity, cur_capacity + weight[i], i + 1, sum + profit[i], pick)
pick.pop()
def recurse_knapsack(weight, profit, size, capacity, cur_capacity=0, i=0, sum=0, pick=[]):
global ans, picked
if i >= size:
if i == size and ans < sum:
ans = sum
picked = copy.deepcopy(pick)
return
# pick
if cur_capacity + weight[i] <= capacity:
pick.append(i) # do
recurse_knapsack(weight, profit, size, capacity, cur_capacity + weight[i], i + 1, sum + profit[i], pick) # recruse
pick.pop() # undo
# leave
recurse_knapsack(weight, profit, size, capacity, cur_capacity, i + 1, sum, pick)
def table_knapsack(weight, profit, size, capacity):
dp = [[0] * (capacity + 1) for _ in range(size + 1)]
for i in range(1, size + 1):
for w in range(1, capacity + 1):
if w >= weight[i - 1]:
dp[i][w] = max(profit[i - 1] + dp[i - 1][w - weight[i - 1]], dp[i - 1][w])
else:
dp[i][w] = dp[i - 1][w]
return dp
def get_selected_indices(dp):
picked = []
wt = len(dp[0]) - 1
i = len(dp) - 1
while wt > 0 and i > 0:
if dp[i][wt] != dp[i - 1][wt]:
picked.append(i - 1)
wt -= weight[i - 1]
i -= 1
return picked
ZGVmIGdyZWVkeV9rbmFiKHdlaWdodCwgcHJvZml0LCBzaXplLCBjYXBhY2l0eSwgdXNlZD1Ob25lKToKICAgIGlmIHVzZWQgaXMgTm9uZToKICAgICAgICB1c2VkID0gW10KCiAgICBpZiBjYXBhY2l0eSA8PSAwOgogICAgICAgIGdsb2JhbCBwYXRoMSAgIAogICAgICAgIHBhdGgxPXVzZWQKICAgICAgICByZXR1cm4gMAoKICAgIG1heCA9IHByb2ZpdFswXQogICAgY2hvc2VuX29uZSA9IC0xCiAgICBmb3IgaSBpbiByYW5nZShzaXplKToKICAgICAgICBpZiBpIG5vdCBpbiB1c2VkIGFuZCB3ZWlnaHRbaV0gPD0gY2FwYWNpdHk6CiAgICAgICAgICAgIGlmIHByb2ZpdFtpXSA+PSBtYXg6CiAgICAgICAgICAgICAgICBtYXggPSBwcm9maXRbaV0KICAgICAgICAgICAgICAgIGNob3Nlbl9vbmUgPSBpCiAgICBpZiBjaG9zZW5fb25lID09IC0xOgogICAgICAgIHBhdGgxPXVzZWQKICAgICAgICByZXR1cm4gMAogICAgdXNlZC5hcHBlbmQoY2hvc2VuX29uZSkKICAgIHJldHVybiBwcm9maXRbY2hvc2VuX29uZV0gKyBncmVlZHlfa25hYih3ZWlnaHQsIHByb2ZpdCwgc2l6ZSwgY2FwYWNpdHkgLSB3ZWlnaHRbY2hvc2VuX29uZV0sdXNlZCkKCmRlZiBkcF9rbmFwc2FjayhkcCwgd2VpZ2h0LCBwcm9maXQsIHNpemUsIGNhcGFjaXR5LCBjdXJfY2FwYWNpdHk9MCwgaT0wLCBzdW09MCwgcGljaz1bXSk6CiAgICBnbG9iYWwgYW5zLCBwaWNrZWQKICAgIGlmIGkgPj0gc2l6ZToKICAgICAgICBpZiBpID09IHNpemUgYW5kIGFucyA8IHN1bToKICAgICAgICAgICAgYW5zID0gc3VtCiAgICAgICAgICAgIHBpY2tlZCA9IGNvcHkuZGVlcGNvcHkocGljaykKICAgICAgICByZXR1cm4KICAgIGlmIGRwW2ldW2N1cl9jYXBhY2l0eV0gIT0gLTEgYW5kIGRwW2ldW2N1cl9jYXBhY2l0eV0gPj0gc3VtOgogICAgICAgIHJldHVybgogICAgZHBbaV1bY3VyX2NhcGFjaXR5XSA9IHN1bQogICAgIyBsZWF2ZQogICAgZHBfa25hcHNhY2soZHAsIHdlaWdodCwgcHJvZml0LCBzaXplLCBjYXBhY2l0eSwgY3VyX2NhcGFjaXR5LCBpKzEsIHN1bSwgcGljaykKCiAgICAjIHBpY2sKICAgIGlmIGN1cl9jYXBhY2l0eSArIHdlaWdodFtpXSA8PSBjYXBhY2l0eToKICAgICAgICBwaWNrLmFwcGVuZChpKQogICAgICAgIGRwX2tuYXBzYWNrKGRwLCB3ZWlnaHQsIHByb2ZpdCwgc2l6ZSwgY2FwYWNpdHksIGN1cl9jYXBhY2l0eSArIHdlaWdodFtpXSwgaSArIDEsIHN1bSArIHByb2ZpdFtpXSwgcGljaykKICAgICAgICBwaWNrLnBvcCgpCgpkZWYgcmVjdXJzZV9rbmFwc2Fjayh3ZWlnaHQsIHByb2ZpdCwgc2l6ZSwgY2FwYWNpdHksIGN1cl9jYXBhY2l0eT0wLCBpPTAsIHN1bT0wLCBwaWNrPVtdKToKICAgIGdsb2JhbCBhbnMsIHBpY2tlZAogICAgaWYgaSA+PSBzaXplOgogICAgICAgIGlmIGkgPT0gc2l6ZSBhbmQgYW5zIDwgc3VtOgogICAgICAgICAgICBhbnMgPSBzdW0KICAgICAgICAgICAgcGlja2VkID0gY29weS5kZWVwY29weShwaWNrKQogICAgICAgIHJldHVybgoKICAgICMgcGljawogICAgaWYgY3VyX2NhcGFjaXR5ICsgd2VpZ2h0W2ldIDw9IGNhcGFjaXR5OgogICAgICAgIHBpY2suYXBwZW5kKGkpICAjIGRvCiAgICAgICAgcmVjdXJzZV9rbmFwc2Fjayh3ZWlnaHQsIHByb2ZpdCwgc2l6ZSwgY2FwYWNpdHksIGN1cl9jYXBhY2l0eSArIHdlaWdodFtpXSwgaSArIDEsIHN1bSArIHByb2ZpdFtpXSwgcGljaykgIyByZWNydXNlCiAgICAgICAgcGljay5wb3AoKSAjIHVuZG8KCiAgICAjIGxlYXZlCiAgICByZWN1cnNlX2tuYXBzYWNrKHdlaWdodCwgcHJvZml0LCBzaXplLCBjYXBhY2l0eSwgY3VyX2NhcGFjaXR5LCBpICsgMSwgc3VtLCBwaWNrKQoKZGVmIHRhYmxlX2tuYXBzYWNrKHdlaWdodCwgcHJvZml0LCBzaXplLCBjYXBhY2l0eSk6CiAgICBkcCA9IFtbMF0gKiAoY2FwYWNpdHkgKyAxKSBmb3IgXyBpbiByYW5nZShzaXplICsgMSldCiAgICBmb3IgaSBpbiByYW5nZSgxLCBzaXplICsgMSk6CiAgICAgICAgZm9yIHcgaW4gcmFuZ2UoMSwgY2FwYWNpdHkgKyAxKToKICAgICAgICAgICAgaWYgdyA+PSB3ZWlnaHRbaSAtIDFdOgogICAgICAgICAgICAgICAgZHBbaV1bd10gPSBtYXgocHJvZml0W2kgLSAxXSArIGRwW2kgLSAxXVt3IC0gd2VpZ2h0W2kgLSAxXV0sIGRwW2kgLSAxXVt3XSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRwW2ldW3ddID0gZHBbaSAtIDFdW3ddCiAgICByZXR1cm4gZHAKCmRlZiBnZXRfc2VsZWN0ZWRfaW5kaWNlcyhkcCk6CiAgICBwaWNrZWQgPSBbXQogICAgd3QgPSBsZW4oZHBbMF0pIC0gMQogICAgaSA9IGxlbihkcCkgLSAxCiAgICB3aGlsZSB3dCA+IDAgYW5kIGkgPiAwOgogICAgICAgIGlmIGRwW2ldW3d0XSAhPSBkcFtpIC0gMV1bd3RdOgogICAgICAgICAgICBwaWNrZWQuYXBwZW5kKGkgLSAxKQogICAgICAgICAgICB3dCAtPSB3ZWlnaHRbaSAtIDFdCiAgICAgICAgaSAtPSAxCiAgICByZXR1cm4gcGlja2VkCg==