1
1
"""
2
- Given weights and values of n items, put these items in a knapsack of capacity W to get the maximum total value in the knapsack.
2
+ Given weights and values of n items, put these items in a knapsack of
3
+ capacity W to get the maximum total value in the knapsack.
3
4
4
- Note that only the integer weights 0-1 knapsack problem is solvable using dynamic programming.
5
+ Note that only the integer weights 0-1 knapsack problem is solvable
6
+ using dynamic programming.
5
7
"""
6
8
7
- def MF_knapsack (i ,wt ,val ,j ):
9
+
10
+ def MF_knapsack (i , wt , val , j ):
8
11
'''
9
12
This code involves the concept of memory functions. Here we solve the subproblems which are needed
10
13
unlike the below example
11
14
F is a 2D array with -1s filled up
12
15
'''
13
16
global F # a global dp table for knapsack
14
17
if F [i ][j ] < 0 :
15
- if j < wt [i - 1 ]:
16
- val = MF_knapsack (i - 1 , wt ,val ,j )
18
+ if j < wt [i - 1 ]:
19
+ val = MF_knapsack (i - 1 , wt , val , j )
17
20
else :
18
- val = max (MF_knapsack (i - 1 ,wt ,val ,j ),MF_knapsack (i - 1 ,wt ,val ,j - wt [i - 1 ]) + val [i - 1 ])
21
+ val = max (MF_knapsack (i - 1 , wt , val , j ),
22
+ MF_knapsack (i - 1 , wt , val , j - wt [i - 1 ]) + val [i - 1 ])
19
23
F [i ][j ] = val
20
24
return F [i ][j ]
21
25
@@ -24,9 +28,9 @@ def knapsack(W, wt, val, n):
24
28
dp = [[0 for i in range (W + 1 )]for j in range (n + 1 )]
25
29
26
30
for i in range (1 ,n + 1 ):
27
- for w in range (1 ,W + 1 ):
28
- if ( wt [i - 1 ]<= w ) :
29
- dp [i ][w ] = max (val [i - 1 ]+ dp [i - 1 ][w - wt [i - 1 ]],dp [i - 1 ][w ])
31
+ for w in range (1 , W + 1 ):
32
+ if wt [i - 1 ] <= w :
33
+ dp [i ][w ] = max (val [i - 1 ] + dp [i - 1 ][w - wt [i - 1 ]], dp [i - 1 ][w ])
30
34
else :
31
35
dp [i ][w ] = dp [i - 1 ][w ]
32
36
0 commit comments