Explain how dynamic programming solves the 0 1 Knapsack Problem step-by-step.
Think about building solutions from smaller subproblems.
You got /4 concepts.
Describe the difference between the 0 1 Knapsack Problem and the Fractional Knapsack Problem.
Focus on item selection rules and solution methods.
You got /4 concepts.
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
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.
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.
Why DP is Needed
DP explores all combinations of 0/1 choices, which is required when greedy fails due to the binary selection constraint.
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
Table Dimensions
The DP table is dp[n+1][W+1]. With n=3 items and W=5 capacity: dp[4][6].
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.
In C
int dp[4][6]; - 4 rows (0 to 3 items), 6 columns (capacity 0 to 5).
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
Can't Include Overweight Item
If weight[i] > w, item i cannot fit - we must skip it.
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.
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
Time Complexity
Two nested loops: outer over n items, inner over W+1 capacities. Each cell O(1). Total: O(n×W).
Space Complexity
Full table dp[n+1][W+1] → O(n×W) space.
Note
Space can be reduced to O(W) with 1D rolling array, but standard 2D table is O(n×W).
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
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.
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.