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.
R DSA Implementation
basic.R
row_string <- function(row) paste0("[", paste(row, collapse = ", "), "]")
table_string <- function(table_rows) paste0("[", paste(apply(table_rows, 1, row_string), collapse = ", "), "]")
weights <- c(2, 3, 4, 5)
values <- c(3, 4, 5, 6)
capacity <- 5
dp <- matrix(0, nrow = length(weights) + 1, ncol = capacity + 1)
for (item in 1:length(weights)) {
weight <- weights[item]
value <- values[item]
for (cap in 0:capacity) {
if (weight > cap) {
dp[item + 1, cap + 1] <- dp[item, cap + 1]
} else {
skip <- dp[item, cap + 1]
take <- value + dp[item, cap - weight + 1]
dp[item + 1, cap + 1] <- max(skip, take)
}
}
}
cat(dp[length(weights) + 1, capacity + 1], "\n", sep = "")
cat(table_string(dp), "\n", sep = "")
@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