Bird
Raised Fist0
DSA Cprogramming~10 mins

0 1 Knapsack Problem in DSA C - Execution Trace

Choose your learning style10 modes available
Concept Flow - 0 1 Knapsack Problem
Start with empty knapsack
↓
For each item i
↓
For each weight w from 0 to W
↓
Check if item i fits (weight[i
↓
Include item i: value[i
↓
Update dp[i
↓
Repeat for all items and weights
↓
Final answer in dp[n
We fill a table dp where each cell dp[i][w] stores the best value using first i items with max weight w. For each item and weight, we decide to include or exclude the item to maximize value.
Execution Sample
DSA C
int dp[4][8] = {0};
int weights[] = {1, 3, 4};
int values[] = {1, 4, 5};
int W = 7;

// Fill dp table
This code fills a dp table for 3 items and max weight 7 to find max value.
Execution Table
StepOperationItem iWeight wInclude Item ValueExclude Item Valuedp[i][w] Updateddp Table State
1Initialize dp row 000-7--0[0,0,0,0,0,0,0,0]
2Process item 110-dp[0][0]=00[0,0,0,0,0,0,0,0]
3Process item 111value=1 + dp[0][0]=0dp[0][1]=01[0,1,0,0,0,0,0,0]
4Process item 112value=1 + dp[0][1]=0dp[0][2]=01[0,1,1,0,0,0,0,0]
5Process item 113value=1 + dp[0][2]=0dp[0][3]=01[0,1,1,1,0,0,0,0]
6Process item 114value=1 + dp[0][3]=0dp[0][4]=01[0,1,1,1,1,0,0,0]
7Process item 115value=1 + dp[0][4]=0dp[0][5]=01[0,1,1,1,1,1,0,0]
8Process item 116value=1 + dp[0][5]=0dp[0][6]=01[0,1,1,1,1,1,1,0]
9Process item 117value=1 + dp[0][6]=0dp[0][7]=01[0,1,1,1,1,1,1,1]
10Process item 220-dp[1][0]=00[0,1,1,1,1,1,1,1]
11Process item 221-dp[1][1]=11[0,1,1,1,1,1,1,1]
12Process item 222-dp[1][2]=11[0,1,1,1,1,1,1,1]
13Process item 223value=4 + dp[1][0]=0dp[1][3]=14[0,1,1,4,1,1,1,1]
14Process item 224value=4 + dp[1][1]=1dp[1][4]=15[0,1,1,4,5,1,1,1]
15Process item 225value=4 + dp[1][2]=1dp[1][5]=15[0,1,1,4,5,5,1,1]
16Process item 226value=4 + dp[1][3]=4dp[1][6]=18[0,1,1,4,5,5,8,1]
17Process item 227value=4 + dp[1][4]=5dp[1][7]=19[0,1,1,4,5,5,8,9]
18Process item 330-dp[2][0]=00[0,1,1,4,5,5,8,9]
19Process item 331-dp[2][1]=11[0,1,1,4,5,5,8,9]
20Process item 332-dp[2][2]=11[0,1,1,4,5,5,8,9]
21Process item 333-dp[2][3]=44[0,1,1,4,5,5,8,9]
22Process item 334value=5 + dp[2][0]=0dp[2][4]=55[0,1,1,4,5,5,8,9]
23Process item 335value=5 + dp[2][1]=1dp[2][5]=56[0,1,1,4,5,6,8,9]
24Process item 336value=5 + dp[2][2]=1dp[2][6]=86[0,1,1,4,5,6,8,9]
25Process item 337value=5 + dp[2][3]=4dp[2][7]=99[0,1,1,4,5,6,8,9]
26End-----Final dp table filled
💡 All items processed for all weights up to W=7, dp table complete
Variable Tracker
VariableStartAfter Step 9After Step 17After Step 25Final
dp row[0,0,0,0,0,0,0,0][0,1,1,1,1,1,1,1][0,1,1,4,5,5,8,9][0,1,1,4,5,6,8,9][0,1,1,4,5,6,8,9]
i (item index)01233
w (weight)07777
Key Moments - 3 Insights
Why do we add value[i] to dp[i-1][w-weight[i]] when including an item?
Because dp[i-1][w-weight[i]] represents the best value achievable with previous items and remaining weight after including current item. See rows 13,14 where inclusion sums value[i] + dp from smaller weight.
Why do we sometimes keep dp[i][w] same as dp[i-1][w]?
When the item doesn't fit or excluding it gives better value, we keep dp[i][w] same as dp[i-1][w]. For example, in rows 2,3, and 10,11 exclusion is chosen.
Why does the dp table have one extra row and column?
Row 0 and column 0 represent base cases: no items or zero capacity. This simplifies logic by providing initial values, as seen in step 1.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 16, what is the value of dp[2][6]?
A6
B5
C8
D9
💡 Hint
Check the 'dp[i][w] Updated' column at step 16 in execution_table
At which step does the dp table first update dp[i][w] to 4?
AStep 21
BStep 13
CStep 14
DStep 22
💡 Hint
Look for dp[i][w] Updated column with value 4 in execution_table
If the weight of item 2 changed from 3 to 2, how would dp[2][3] change at step 13?
AIt would become 5
BIt would remain 4
CIt would become 1
DIt would become 0
💡 Hint
Including item 2 at weight 3 would add value[2] + dp[i-1][w-weight[i]]; with smaller weight, dp index changes
Concept Snapshot
0 1 Knapsack Problem:
- Use dp[i][w] for max value with first i items and weight limit w
- For each item and weight, choose max(include, exclude)
- Include: value[i] + dp[i-1][w-weight[i]] if fits
- Exclude: dp[i-1][w]
- Final answer at dp[n][W]
Full Transcript
The 0 1 Knapsack problem uses a table dp where dp[i][w] stores the best value using first i items with max weight w. We fill this table row by row, checking for each item if it fits in the current weight. If it fits, we consider including it by adding its value plus the best value for remaining weight. Otherwise, we exclude it and keep previous best. The final answer is in dp[n][W]. The execution table shows step-by-step how dp is updated for each item and weight. Key moments clarify why we add values and why base cases exist. The visual quiz tests understanding of dp values at specific steps and effects of weight changes.

Practice

(1/5)
1. In the 0/1 Knapsack problem, why can't we take fractions of items like in the Fractional Knapsack?
easy
A. Because the DP table only stores integers
B. Because each item must be taken as a whole unit or not at all - fractional inclusion violates the problem definition
C. Because fractions make the recursion infinite
D. Because the weight array only accepts integer values

Solution

  1. 0/1 Constraint

    The '0/1' in the name literally means each item has two states: not taken (0) or fully taken (1). There is no state for 0.5 or any fraction.
  2. Why Greedy Fails

    Because you cannot take fractions, the greedy 'highest value/weight ratio first' strategy fails - taking a high-ratio item may block a better combination of whole items.
  3. Why DP is Needed

    DP explores all combinations of 0/1 choices, which is required when greedy fails due to the binary selection constraint.
  4. Final Answer:

    Each item is binary - take it whole or skip it. → Option B
Hint: 0/1 = binary choice per item: take it whole or skip entirely. [OK]
Common Mistakes:
  • Confusing 0/1 Knapsack with Fractional Knapsack
  • Thinking DP table data type restricts selection
  • Assuming greedy works for 0/1 Knapsack
2. For 0/1 Knapsack with n=3 items and capacity W=5, what is the size of the standard DP table dp[n+1][W+1] in C?
easy
A. 3 × 5
B. 4 × 5
C. 3 × 6
D. 4 × 6

Solution

  1. Table Dimensions

    The DP table is dp[n+1][W+1]. With n=3 items and W=5 capacity: dp[4][6].
  2. Why +1

    Index 0 represents the base case: dp[0][w] = 0 (no items) and dp[i][0] = 0 (zero capacity). The +1 makes these base cases fit naturally without off-by-one adjustments.
  3. In C

    int dp[4][6]; - 4 rows (0 to 3 items), 6 columns (capacity 0 to 5).
  4. Final Answer:

    4 × 6 → Option D
Hint: dp[n+1][W+1] → always add 1 to both dimensions for the base case. [OK]
Common Mistakes:
  • Using dp[n][W] and missing the base case row/column
  • Adding +1 to only one dimension
  • Confusing n items with n+1 rows
3. In the 0/1 Knapsack DP recurrence, when weight[i] > w (current item is heavier than current capacity), what is dp[i][w]?
medium
A. 0
B. dp[i-1][w] - same value as without this item
C. dp[i][w-1]
D. value[i] + dp[i-1][w - weight[i]]

Solution

  1. Can't Include Overweight Item

    If weight[i] > w, item i cannot fit - we must skip it.
  2. Inherit from Previous Row

    dp[i][w] = dp[i-1][w]: the best value with first i items equals the best with first i-1 items.
  3. Full Recurrence

    if (weight[i] > w): dp[i][w] = dp[i-1][w]. else: dp[i][w] = max(dp[i-1][w], value[i] + dp[i-1][w-weight[i]])
  4. Final Answer:

    dp[i-1][w] → Option B
Hint: Item too heavy → skip → copy from row above: dp[i-1][w]. [OK]
Common Mistakes:
  • Setting dp[i][w]=0 instead of carrying forward the previous best
  • Applying include formula when item doesn't fit
  • Reading dp[i][w-1] instead of dp[i-1][w]
4. What is the time and space complexity of the standard bottom-up 0/1 Knapsack DP solution?
medium
A. Time O(n×W), Space O(n×W)
B. Time O(n×W), Space O(W)
C. Time O(2^n), Space O(n)
D. Time O(n log W), Space O(n×W)

Solution

  1. Time Complexity

    Two nested loops: outer over n items, inner over W+1 capacities. Each cell O(1). Total: O(n×W).
  2. Space Complexity

    Full table dp[n+1][W+1] → O(n×W) space.
  3. Note

    Space can be reduced to O(W) with 1D rolling array, but standard 2D table is O(n×W).
  4. Final Answer:

    Time O(n×W), Space O(n×W) → Option A
Hint: Standard 2D table = O(n×W) time AND space. 1D optimized = O(W) space only. [OK]
Common Mistakes:
  • Confusing standard O(n×W) space with optimized O(W)
  • Claiming O(2^n) which applies only to naive recursion
  • Mixing up time and space complexities
5. In the space-optimized 1D 0/1 Knapsack in C, why must the inner capacity loop iterate from W down to weight[i], not from 0 up to W?
hard
A. To avoid negative array indices
B. To prevent using item i more than once - forward iteration would allow the same item to be counted multiple times in the same pass
C. Because C arrays are stored in column-major order
D. To match the order of the weight array

Solution

  1. Problem With Left-to-Right

    With a 1D array, processing left to right means dp[w-weight[i]] has already been updated in this pass - item i gets counted again at smaller capacities.
  2. Right-to-Left Prevents Reuse

    Iterating from W down to weight[i] ensures dp[w-weight[i]] still holds the pre-item-i value. Each item counted at most once.
  3. 0/1 vs Unbounded

    Right-to-left = 0/1 Knapsack. Left-to-right = Unbounded Knapsack.
  4. Final Answer:

    Prevents reusing item i in the same pass. → Option B
Hint: Right-to-left = 0/1 (no reuse). Left-to-right = Unbounded (reuse allowed). [OK]
Common Mistakes:
  • Using left-to-right which implements Unbounded Knapsack accidentally
  • Thinking loop direction is about array bounds not item reuse
  • Not knowing right-to-left is the key 0/1 vs Unbounded distinction
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard