0-1 Knapsack Problem
0-1 Knapsack Problem
Unlike in fractional knapsack, the items are always stored fully without using the fractional part of them.
Its either the item is added to the knapsack or not. That is why, this method is known as the 0-1
Knapsack problem.
Hence, in case of 0-1 Knapsack, the value of xi can be either 0 or 1, where other constraints remain the
same.
0-1 Knapsack cannot be solved by Greedy approach. Greedy approach does not ensure an optimal
solution in this method. In many instances, Greedy approach may give an optimal solution.
Let i be the highest-numbered item in an optimal solution S for W dollars. Then S’ = S − {i} is an optimal
solution for W – wi dollars and the value to the solution S is Vi plus the value of the sub-problem.
We can express this fact in the following formula: define c[i, w] to be the solution for items 1,2, … , i and
the maximum weight w.
The two sequences v = <v1, v2, …, vn> and w = <w1, w2, …, wn>
The set of items to take can be deduced from the table, starting at c[n, w] and tracing backwards where
the optimal values came from.
If c[i, w] = c[i-1, w], then item i is not part of the solution, and we continue tracing with c[i-1, w].
Otherwise, item i is part of the solution, and we continue tracing with c [i-1, w-W].
Dynamic-0-1-knapsack (v, w, n, W)
for w = 0 to W do
c[0, w] = 0
Page 2 of 5
for i = 1 to n do
c[i, 0] = 0
for w = 1 to W do
if wi ≤ w then
if vi + c[i-1, w-wi] then
c[i, w] = vi + c[i-1, w-wi]
else c[i, w] = c[i-1, w]
else
c[i, w] = c[i-1, w]
Example
Let us consider that the capacity of the knapsack is W = 8 and the items are as shown in the following
table.
Item A B C D
Profit 2 4 7 10
Weight 1 3 5 7
Solution
Using the greedy approach of 0-1 knapsack, the weight that’s stored in the knapsack would be A+B = 4
with the maximum profit 2 + 4 = 6. But, that solution would not be the optimal solution.
Step 1
Construct an adjacency table with maximum weight of knapsack as rows and items with respective
weights and profits as columns.
Values to be stored in the table are cumulative profits of the items whose weights do not exceed the
maximum weight of the knapsack (designated values of each row)
So we add zeroes to the 0th row and 0th column because if the weight of item is 0, then it weighs
nothing; if the maximum weight of knapsack is 0, then no item can be added into the knapsack.
Page 3 of 5
The remaining values are filled with the maximum profit achievable with respect to the items and weight
per column that can be stored in the knapsack.
By computing all the values using the formula, the table obtained would be −
Page 4 of 5
To find the items to be added in the knapsack, recognize the maximum profit from the table and identify
the items that make up the profit, in this example, its {1, 7}.
Analysis
This algorithm takes Ɵ(n.w) times as table c has (n+1).(w+1) entries, where each entry requires Ɵ(1)
time to compute.
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified
expert to boost your career.
Implementation
Following is the final implementation of 0-1 Knapsack Algorithm using Dynamic Programming
Approach.
Open Compiler
#include <stdio.h>
#include <string.h>
int findMax(int n1, int n2){
if(n1>n2) {
Page 5 of 5
return n1;
} else {
return n2;
}
}
int knapsack(int W, int wt[], int val[], int n){
int K[n+1][W+1];
for(int i = 0; i<=n; i++) {
for(int w = 0; w<=W; w++) {
if(i == 0 || w == 0) {
K[i][w] = 0;
} else if(wt[i-1] <= w) {
K[i][w] = findMax(val[i-1] + K[i-1][w-wt[i-1]], K[i-1][w]);
} else {
K[i][w] = K[i-1][w];
}
}
}
return K[n][W];
}
int main(){
int val[5] = {70, 20, 50};
int wt[5] = {11, 12, 13};
int W = 30;
int len = sizeof val / sizeof val[0];
printf("Maximum Profit achieved with this knapsack: %d", knapsack(W,
wt, val, len));
}
Output
Maximum Profit achieved with this knapsack: 120