1
+ def knapsack_dp (capacity : int , weights : list [int ], values : list [int ]) -> int :
2
+ """
3
+ Returns the maximum value that can be put in a knapsack of a given capacity,
4
+ with each weight having a specific value.
5
+
6
+ Uses a dynamic programming approach to solve the 0/1 Knapsack Problem.
7
+
8
+ >>> capacity = 50
9
+ >>> values = [60, 100, 120]
10
+ >>> weights = [10, 20, 30]
11
+ >>> knapsack_dp(capacity, weights, values)
12
+ 220
13
+
14
+ >>> capacity = 0
15
+ >>> values = [60, 100, 120]
16
+ >>> weights = [10, 20, 30]
17
+ >>> knapsack_dp(capacity, weights, values)
18
+ 0
19
+
20
+ >>> capacity = 10
21
+ >>> values = [10, 10, 10]
22
+ >>> weights = [5, 5, 5]
23
+ >>> knapsack_dp(capacity, weights, values)
24
+ 20
25
+
26
+ >>> capacity = 100
27
+ >>> values = [60, 100, 120, 80, 30]
28
+ >>> weights = [10, 20, 30, 40, 50]
29
+ >>> knapsack_dp(capacity, weights, values)
30
+ 360
31
+
32
+ >>> capacity = 7
33
+ >>> values = [1, 4, 5, 7]
34
+ >>> weights = [1, 3, 4, 5]
35
+ >>> knapsack_dp(capacity, weights, values)
36
+ 9
37
+ """
38
+
39
+ n = len (weights )
40
+ dp = [[0 for _ in range (capacity + 1 )] for _ in range (n + 1 )]
41
+
42
+ for i in range (1 , n + 1 ):
43
+ for w in range (1 , capacity + 1 ):
44
+ if weights [i - 1 ] <= w :
45
+ value_included = values [i - 1 ] + dp [i - 1 ][w - weights [i - 1 ]]
46
+ value_excluded = dp [i - 1 ][w ]
47
+ dp [i ][w ] = max (value_included , value_excluded )
48
+ else :
49
+ dp [i ][w ] = dp [i - 1 ][w ]
50
+
51
+ return dp [n ][capacity ]
52
+
53
+
54
+ if __name__ == "__main__" :
55
+ import doctest
56
+
57
+ doctest .testmod ()
0 commit comments