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.
Lua DSA Implementation
basic.lua
local function row_string(row)
local parts = {}
for i, value in ipairs(row) do parts[i] = tostring(value) end
return "[" .. table.concat(parts, ", ") .. "]"
end
local function table_string(table_rows)
local parts = {}
for i, row in ipairs(table_rows) do parts[i] = row_string(row) end
return "[" .. table.concat(parts, ", ") .. "]"
end
local weights = {2, 3, 4, 5}
local values = {3, 4, 5, 6}
local capacity = 5
local dp = {}
for item = 1, #weights + 1 do
dp[item] = {}
for cap = 1, capacity + 1 do dp[item][cap] = 0 end
end
for item = 1, #weights do
local weight = weights[item]
local value = values[item]
for cap = 0, capacity do
if weight > cap then
dp[item + 1][cap + 1] = dp[item][cap + 1]
else
local skip = dp[item][cap + 1]
local take = value + dp[item][cap - weight + 1]
dp[item + 1][cap + 1] = math.max(skip, take)
end
end
end
print(dp[#weights + 1][capacity + 1])
print(table_string(dp))
@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