Skip to content

Commit 456b351

Browse files
committed
Merge pull request mission-peace#77 from orsenthil/python/knapsack_01
01 Knapsack Problem in Python.
2 parents a5bd72d + 9271790 commit 456b351

1 file changed

Lines changed: 79 additions & 0 deletions

File tree

python/dynamic/knapsack_01.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
"""
2+
Problem Statement
3+
=================
4+
5+
0/1 Knapsack Problem - Given items of certain weights/values and maximum allowed weight how to pick items to pick items
6+
from this set to maximize sum of value of items such that sum of weights is less than or equal to maximum allowed
7+
weight.
8+
9+
Runtime Analysis
10+
----------------
11+
Time complexity - O(W*total items)
12+
13+
Video
14+
-----
15+
* Topdown DP - https://youtu.be/149WSzQ4E1g
16+
* Bottomup DP - https://youtu.be/8LusJS5-AGo
17+
18+
References
19+
----------
20+
* http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/
21+
* https://en.wikipedia.org/wiki/Knapsack_problem
22+
"""
23+
24+
25+
def knapsack_01(values, weights, total):
26+
total_items = len(weights)
27+
28+
rows = total_items + 1
29+
cols = total + 1
30+
31+
T = [[0 for _ in range(cols)] for _ in range(rows)]
32+
33+
for i in range(1, rows):
34+
for j in range(1, cols):
35+
if j < weights[i - 1]:
36+
T[i][j] = T[i - 1][j]
37+
else:
38+
T[i][j] = max(T[i - 1][j], values[i - 1] + T[i - 1][j - weights[i - 1]])
39+
40+
return T[rows - 1][cols -1]
41+
42+
43+
def knapsack_01_recursive_util(values, weights, remaining_weight, total_items, current_item, memo):
44+
if current_item >= total_items or remaining_weight <= 0:
45+
return 0
46+
47+
key = (total_items - current_item - 1, remaining_weight)
48+
49+
if key in memo:
50+
return memo[key]
51+
52+
if remaining_weight < weights[current_item]:
53+
max_value = knapsack_01_recursive_util(values, weights, remaining_weight, total_items, current_item + 1, memo)
54+
else:
55+
max_value = max(values[current_item] + knapsack_01_recursive_util(values, weights, remaining_weight - weights[current_item], total_items, current_item + 1, memo),
56+
knapsack_01_recursive_util(values, weights, remaining_weight, total_items, current_item + 1, memo))
57+
58+
memo[key] = max_value
59+
return max_value
60+
61+
62+
def knapsack_01_recursive(values, weights, total_weight):
63+
memo = dict()
64+
return knapsack_01_recursive_util(values, weights, total_weight, len(values), 0, memo)
65+
66+
67+
if __name__ == '__main__':
68+
total_weight = 7
69+
weights = [1, 3, 4, 5]
70+
values = [1, 4, 5, 7]
71+
expected = 9
72+
assert expected == knapsack_01(values, weights, total_weight)
73+
assert expected == knapsack_01_recursive(values, weights, total_weight)
74+
total_weight = 8
75+
weights = [2, 2, 4, 5]
76+
values = [2, 4, 6, 9]
77+
expected = 13
78+
assert expected == knapsack_01(values, weights, total_weight)
79+
assert expected == knapsack_01_recursive(values, weights, total_weight)

0 commit comments

Comments
 (0)