Recursion and Dynamic Programming
0/1 Knapsack (Small)
Fill a small 0/1 knapsack table where each row decides whether one more item is available.
Algorithm
@steps
- Create a table with one extra row for using zero items.
- Process the four items in fixed order.
- For each capacity, inherit when the item is too heavy.
- Otherwise compare
skipandtakefrom the previous row. - Print the best value and the full deterministic table. @end @complexity
- Time: O(item_count * capacity)
- Space: O(item_count * capacity) @end
state transition
`dp[i][w]` compares skipping item `i` with taking it and reading the remaining capacity from the previous row.
C DSA Implementation
basic.c
#include <stdio.h>
void print_table(int table[5][6]) {
printf("[");
for (int i = 0; i < 5; i++) {
if (i > 0) printf(", ");
printf("[");
for (int w = 0; w < 6; w++) {
if (w > 0) printf(", ");
printf("%d", table[i][w]);
}
printf("]");
}
printf("]\n");
}
int main(void) {
int weights[] = {2, 3, 4, 5};
int values[] = {3, 4, 5, 6};
int capacity = 5;
int dp[5][6] = {0};
for (int item = 1; item <= 4; item++) {
int weight = weights[item - 1];
int value = values[item - 1];
for (int cap = 0; cap <= capacity; cap++) {
if (weight > cap) dp[item][cap] = dp[item - 1][cap];
else {
int skip = dp[item - 1][cap];
int take = value + dp[item - 1][cap - weight];
dp[item][cap] = skip > take ? skip : take;
}
}
}
printf("%d\n", dp[4][5]);
print_table(dp);
return 0;
}
@end @output 7 [[0, 0, 0, 0, 0, 0], [0, 0, 3, 3, 3, 3], [0, 0, 3, 4, 4, 7], [0, 0, 3, 4, 5, 7], [0, 0, 3, 4, 5, 7]] @end