📖 Scenario: You are packing a backpack for a hiking trip. You have a list of items, each with a weight and a value. Your backpack can only carry a limited weight. You want to choose items to maximize the total value without exceeding the weight limit.
🎯 Goal: Build a program that uses the 0 1 Knapsack algorithm to find the maximum value of items you can carry in your backpack without exceeding the weight limit.
📋 What You'll Learn
Create a slice of items with exact weights and values
Create a variable for the maximum weight capacity
Implement the 0 1 Knapsack dynamic programming logic
Print the maximum value that fits in the backpack
💡 Why This Matters
🌍 Real World
Packing efficiently for trips, resource allocation, budget management, and selecting projects with limited resources.
💼 Career
Understanding dynamic programming and optimization problems is essential for software engineers, data scientists, and algorithm developers.
Progress0 / 4 steps
1
Create the items slice
Create a slice called items of structs with fields weight and value. Add these exact items: weight 2, value 3; weight 3, value 4; weight 4, value 5; weight 5, value 8.
DSA Go
Hint
Use a slice of Item structs with the exact weights and values given.
2
Set the maximum weight capacity
Create an integer variable called maxWeight and set it to 8.
DSA Go
Hint
Use a simple integer variable named maxWeight and assign it the value 8.
3
Implement the 0 1 Knapsack logic
Create a 2D slice called dp with dimensions len(items)+1 by maxWeight+1 filled with zeros. Use nested for loops with variables i and w to fill dp using the 0 1 Knapsack logic: if the current item's weight is less than or equal to w, set dp[i][w] to the maximum of dp[i-1][w] and dp[i-1][w-items[i-1].weight] + items[i-1].value. Otherwise, set dp[i][w] to dp[i-1][w].
DSA Go
Hint
Use a helper function max to get the maximum of two integers. Create a 2D slice dp and fill it row by row using the 0 1 Knapsack rules.
4
Print the maximum value
Print the value at dp[len(items)][maxWeight] using fmt.Println.
DSA Go
Hint
Use fmt.Println(dp[len(items)][maxWeight]) to print the maximum value.
Practice
(1/5)
1. What does the 0 1 Knapsack Problem aim to maximize given a set of items with weights and values?
easy
A. The total weight of items without exceeding the value limit
B. The total value of items without exceeding the weight limit
C. The number of items selected regardless of weight
D. The minimum weight of items selected
Solution
Step 1: Understand the problem goal
The 0 1 Knapsack Problem tries to select items to maximize total value without exceeding the weight limit.
Step 2: Identify the constraint
The constraint is the maximum weight capacity of the knapsack, so total weight must not exceed it.
Final Answer:
The total value of items without exceeding the weight limit -> Option B
Quick Check:
Maximize value under weight limit = The total value of items without exceeding the weight limit [OK]
Hint: Focus on maximizing value, not weight or count [OK]
Common Mistakes:
Confusing weight limit with value limit
Thinking the problem maximizes number of items
Ignoring the weight constraint
2. Which of the following Go code snippets correctly declares a 2D slice for dynamic programming in 0 1 Knapsack with capacity 'W' and 'n' items?
easy
A. dp := make([][]int, n+1); for i := range dp { dp[i] = make([]int, W+1) }
B. dp := make([]int, n+1, W+1)
C. dp := [][]int{n+1}{W+1}
D. dp := make([][]int, W+1); for i := range dp { dp[i] = make([]int, n+1) }"
Solution
Step 1: Understand 2D slice creation in Go
To create a 2D slice, first create the outer slice with length n+1, then initialize each inner slice with length W+1.
Step 2: Check each option
dp := make([][]int, n+1); for i := range dp { dp[i] = make([]int, W+1) } correctly creates dp with n+1 rows and W+1 columns. Options B and C have syntax errors or wrong types. dp := make([][]int, W+1); for i := range dp { dp[i] = make([]int, n+1) }" swaps dimensions incorrectly.
Final Answer:
dp := make([][]int, n+1); for i := range dp { dp[i] = make([]int, W+1) } -> Option A
Quick Check:
Correct 2D slice init = dp := make([][]int, n+1); for i := range dp { dp[i] = make([]int, W+1) } [OK]
Trying to declare 2D slice in one step incorrectly
3. What is the output of the following Go code snippet for 0 1 Knapsack problem?
package main
import "fmt"
func main() {
weights := []int{1, 3, 4}
values := []int{10, 40, 50}
W := 6
n := len(weights)
dp := make([][]int, n+1)
for i := range dp {
dp[i] = make([]int, W+1)
}
for i := 1; i <= n; i++ {
for w := 1; w <= W; w++ {
if weights[i-1] <= w {
dp[i][w] = max(dp[i-1][w], values[i-1]+dp[i-1][w-weights[i-1]])
} else {
dp[i][w] = dp[i-1][w]
}
}
}
fmt.Println(dp[n][W])
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
medium
A. 80
B. 100
C. 90
D. 50
Solution
Step 1: Trace the DP table filling
Items: (weight=1,value=10), (3,40), (4,50), capacity=6. Calculate max value for each capacity step by step.
Step 2: Calculate max value for capacity 6
Choosing items 2 and 3 (weights 3+4=7) exceeds capacity, so best is items 1 and 3 (1+4=5) with value 10+50=60 or items 2 alone (40). But items 1 and 2 (1+3=4) value 10+40=50. Actually, best is items 2 and 3 separately or items 1 and 2 and 3? Check dp: max value at capacity 6 is 90 (items 2 and 3 combined is invalid, but items 1,2,3 combined weight 8 > 6). So best is items 2 and 3 separately or items 1 and 3 combined. The code outputs 90.
Final Answer:
90 -> Option C
Quick Check:
Max value for capacity 6 = 90 [OK]
Hint: Trace DP table row by row for each item [OK]
Common Mistakes:
Adding values without checking weight limit
Confusing indices in dp array
Forgetting to subtract weight when adding value
4. Find the error in this Go code snippet for 0 1 Knapsack DP and select the fix:
for i := 1; i <= n; i++ {
for w := 1; w <= W; w++ {
if weights[i] <= w {
dp[i][w] = max(dp[i-1][w], values[i]+dp[i-1][w-weights[i]])
} else {
dp[i][w] = dp[i-1][w]
}
}
}
medium
A. Use weights[i-1] and values[i-1] instead of weights[i] and values[i]
B. Change loop to start from i := 0
C. Replace max function with min function
D. Remove else block
Solution
Step 1: Identify index error in array access
Arrays weights and values are zero-indexed, but loop uses i starting from 1, so weights[i] and values[i] cause out-of-range or wrong access.
Step 2: Correct indexing for zero-based arrays
Use weights[i-1] and values[i-1] to access correct elements corresponding to current item i.
Final Answer:
Use weights[i-1] and values[i-1] instead of weights[i] and values[i] -> Option A
Quick Check:
Fix indexing error = Use weights[i-1] and values[i-1] instead of weights[i] and values[i] [OK]
Hint: Remember Go slices start at index 0 [OK]
Common Mistakes:
Using 1-based indexing on zero-based slices
Ignoring out-of-range errors
Changing loop start incorrectly
5. Given items with weights [2, 3, 5, 7] and values [1, 5, 2, 4], and knapsack capacity 10, which combination of items gives the maximum value using 0 1 Knapsack?
hard
A. Items with weights 5 and 7, total value 6
B. Items with weights 2, 3, and 5, total value 8
C. Items with weights 2 and 7, total value 5
D. Items with weights 3 and 7, total value 9
Solution
Step 1: Calculate total weights and values for each option
Items with weights 3 and 7, total value 9: weights 3+7=10, values 5+4=9; Items with weights 2, 3, and 5, total value 8: 2+3+5=10, values 1+5+2=8; Items with weights 2 and 7, total value 5: 2+7=9, values 1+4=5; Items with weights 5 and 7, total value 6: 5+7=12 (exceeds capacity), invalid.
Step 2: Choose combination with max value under capacity
Items with weights 3 and 7, total value 9 and B fit capacity 10, but Items with weights 3 and 7, total value 9 has higher value 9 vs 8. Items with weights 5 and 7, total value 6 exceeds capacity, Items with weights 2 and 7, total value 5 has lower value.
Final Answer:
Items with weights 3 and 7, total value 9 -> Option D
Quick Check:
Max value with capacity 10 = 9 [OK]
Hint: Sum weights and values, pick max value under capacity [OK]
Common Mistakes:
Choosing items exceeding capacity
Ignoring total value comparison
Adding too many items without checking weight
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.