0 1knapsack
0 1knapsack
0-1 Knapsack
problem
Zeeshan Mubeen
Senior Lecturer (RSCI)
1
0-1 Knapsack problem
3
This is a knapsack 2
Max weight: W = 20
3 4
5 8
W = 20 4 5
9 10
04/04/17 3
Defining a Subproblem
w1 =2 w2=3 w3 =4 w4 =5 Weight
wi
b1 =3 b2
=4
b3 =5
?
b4 =8 ItemBenefit
#
b2
i
1 3
Max weight: W = 20
S4 2 3 4
For S 4:
Total S5 3 4 5
weight: 14; 4 5 8
total
benefit: 20 5 9 10
w1 =2 w2=4 w3 =5 w4 =9
b1 =3 b2 b3 =8 b4 =10
=5
For S 5:
Solution for S4 is
Total not part of the
04/04/17 weight: 20 solution for S5!!! 13
total
Example #1
Let’s run our algorithm on the
following data:
n = 4 (# of elements)
W = 5 (max weight)
Elements (weight, benefit):
(2,3), (3,4), (4,5), (5,6)
04/04/17 5
i 0 1 2 3 4
W
0 0
1 0
2 0
3 0
4 0
5 0
for w = 0 to W
B[0,w] = 0
04/04/17 6
i 0 1 2 3 4
W
0 0 0 0 0 0
1 0
2 0
3 0
4 0
5 0
for i = 0 to n
B[i,0] = 0
04/04/17 7
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 i=1 4: (5,6)
2 0 bi=3
3 0 wi=2
4 0
5 0
w=1
if w <= w // item i can be part of the solution
i w-wi
if b + B[i-1,w-w ] > B[i-1,w]
i i
=-1
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // 22
wi > w
Items:
Example (5) 1: (2,3)
i 0 1 2 3 4
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 i=1 4: (5,6)
2 0 3 bi=3
3 0 wi=2
4 0
5 0
w=2
if w <= w // item i can be part of the solution
i w-wi
if b + B[i-1,w-w ] > B[i-1,w]
i i
=0
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 23
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 i=1 4: (5,6)
2 0 3 bi=3
3 0 3 wi=2
4 0
5 0
w=3
if w <= w // item i can be part of the solution
i w-
if b + B[i-1,w-w ] > B[i-1,w]
i i
wi=1
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 24
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 i=1 4: (5,6)
2 0 3 bi=3
3 0 3 wi=2
4 0 3
5 0
w=4
if w <= w // item i can be part of the solution
i w-
if b + B[i-1,w-w ] > B[i-1,w]
i i
wi=2
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 25
Items:
Example (8) 1: (2,3)
i 0 1 2 3 4
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 i=1 4: (5,6)
2 0 3 bi=3
3 0 3 wi=2
4 0 3
5 0 3
w=5
if w <= w // item i can be part of the solution
i w-
if b + B[i-1,w-w ] > B[i-1,w]
i i
wi=2
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 26
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 i=2 4: (5,6)
2 0 3 bi=4
3 0 3 wi=3
4 0 3
5 0 3
w=1
if w <= w // item i can be part of the solution
i w-
if b + B[i-1,w-w ] > B[i-1,w]
i i
wi=-
B[i,w] = b + B[i-1,w- w ]
2
i i
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // 27
wi > w
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 i=2 4: (5,6)
2 0 3 3 bi=4
3 0 3 wi=3
4 0 3
5 0 3
w=2
if w <= w // item i can be part of the solution
i w-
if b + B[i-1,w-w ] > B[i-1,w]
i i
wi=-
B[i,w] = b + B[i-1,w- w ]
1
i i
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // 28
wi > w
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 i=2 4: (5,6)
2 0 3 3 bi=4
3 0 3 4 wi=3
4 0 3
5 0 3
w=3
if w <= w // item i can be part of the solution
i w-
if b + B[i-1,w-w ] > B[i-1,w]
i i
wi=0
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 29
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 i=2 4: (5,6)
2 0 3 3 bi=4
3 0 3 4 wi=3
4 0 3 4
5 0 3
w=4
if w <= w // item i can be part of the solution
i w-
if b + B[i-1,w-w ] > B[i-1,w]
i i
wi=1
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 30
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 i=2 4: (5,6)
2 0 3 3 bi=4
3 0 3 4 wi=3
4 0 3 4
5 0 3 7
w=5
if w <= w // item i can be part of the solution
i
w-
if b + B[i-1,w-w ] > B[i-1,w]
i i
wi=2
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 17
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 0 i=3 4: (5,6)
2 0 3 3 3 bi=5
3 0 3 4 4 wi=
4 0 3 4 4 =1..3
w
5 0 3 7
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 18
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 0 i=3 4: (5,6)
2 0 3 3 3 bi=5
3 0 3 4 4 wi=4
4 0 3 4 5
5 0 3 7 w-
w=4wi=0
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // wi > w 33
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 0 i=3 4: (5,6)
2 0 3 3 3 bi=5
3 0 3 4 4 wi=4
4 0 3 4 5
5 0 3 7 7 w-
w=5wi=1
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // 20
wi > w
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 0 0 i=3 4: (5,6)
2 0 3 3 3 3 bi=5
3 0 3 4 4 4 wi=
4 0 3 4 5 5 4 =1..4
w
5 0 3 7 7
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // 21
wi > w
Items:
i 1: (2,3)
0 1
W 2: (3,4)
0 0 0 0 0 0 3: (4,5)
1 0 0 0 0 0 i=3 4: (5,6)
2 0 3 3 3 3 bi=5
3 0 3 4 4 4 wi=4
4 0 3 4 5 5
5 0 3 7 7 7
w=5
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
04/04/17 else B[i,w] = B[i-1,w] // 36
wi > w
Conclusion
Dynamic programming is a useful
technique of solving certain kind
of problems
When the solution can be recursively
described in terms of partial solutions, we
can store these partial solutions and re-
use them as necessary
Running time (Dynamic Programming
algorithm vs. naïve algorithm):
– LCS: O(m*n) vs. O(n * 2m)
38
The End
04/04/17 39