Bird
Raised Fist0
DSA Rustprogramming~10 mins

0 1 Knapsack Problem in DSA Rust - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to initialize the DP table with zeros.

DSA Rust
let mut dp = vec![vec![[1]; capacity + 1]; n + 1];
Drag options to blanks, or click blank then click option'
A0
B1
Ccapacity
Dn
Attempts:
3 left
💡 Hint
Common Mistakes
Initializing with 1 causes incorrect base cases.
Using capacity or n as initial values is wrong.
2fill in blank
medium

Complete the code to check if the current item's weight fits in the current capacity.

DSA Rust
if weights[i - 1] [1] w {
Drag options to blanks, or click blank then click option'
A!=
B>
C<=
D==
Attempts:
3 left
💡 Hint
Common Mistakes
Using '>' excludes items that fit.
Using '==' is too strict.
3fill in blank
hard

Fix the error in the code to correctly update the DP table when including the item.

DSA Rust
dp[i][w] = dp[i - 1][w - weights[i - 1]] [1] values[i - 1];
Drag options to blanks, or click blank then click option'
A-
B+
C/
D*
Attempts:
3 left
💡 Hint
Common Mistakes
Using '-' subtracts value incorrectly.
Using '*' or '/' is not meaningful here.
4fill in blank
hard

Fill both blanks to choose the maximum value between including and excluding the item.

DSA Rust
dp[i][w] = std::cmp::[1](dp[i - 1][w], dp[i - 1][w - weights[i - 1]] [2] values[i - 1]);
Drag options to blanks, or click blank then click option'
Amax
Bmin
C+
D-
Attempts:
3 left
💡 Hint
Common Mistakes
Using min picks the smaller value.
Using '-' subtracts value incorrectly.
5fill in blank
hard

Fill all three blanks to complete the nested loops iterating over items and capacities.

DSA Rust
for [1] in 1..=[2] {
    for [3] in 0..=capacity {
Drag options to blanks, or click blank then click option'
Ai
Bn
Cw
Dcapacity
Attempts:
3 left
💡 Hint
Common Mistakes
Using capacity as loop variable for items.
Using n as loop variable for capacity.

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 number of items selected
B. The total weight of items regardless of value
C. The total value of items without exceeding the weight limit
D. The minimum weight of selected items

Solution

  1. Step 1: Understand the problem goal

    The 0 1 Knapsack Problem tries to select items to maximize total value without exceeding the weight capacity.
  2. Step 2: Clarify constraints

    Each item can be chosen only once (0 or 1 times), so the goal is to maximize value under weight limit.
  3. Final Answer:

    The total value of items without exceeding the weight limit -> Option C
  4. 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 maximization with value maximization
  • Selecting items multiple times
  • Ignoring the weight limit
2. Which of the following Rust code snippets correctly declares a 2D vector for dynamic programming table in 0 1 Knapsack?
easy
A. let mut dp = vec![vec![0; capacity + 1]; n + 1];
B. let dp = vec![0; capacity + 1];
C. let mut dp = [0; n + 1][capacity + 1];
D. let dp = vec![vec![0; n + 1]; capacity + 1];

Solution

  1. Step 1: Identify correct 2D vector initialization

    In Rust, a 2D vector is created with vec![vec![initial_value; inner_size]; outer_size].
  2. Step 2: Match dimensions for DP table

    DP table size is (n+1) rows and (capacity+1) columns, so vec![vec![0; capacity + 1]; n + 1] is correct.
  3. Final Answer:

    let mut dp = vec![vec![0; capacity + 1]; n + 1]; -> Option A
  4. Quick Check:

    2D vector with correct sizes = let mut dp = vec![vec![0; capacity + 1]; n + 1]; [OK]
Hint: Use vec![vec![0; cols]; rows] for 2D vectors [OK]
Common Mistakes:
  • Using fixed-size arrays incorrectly
  • Swapping rows and columns sizes
  • Not making vector mutable when updating
3. What is the output of this Rust code snippet for 0 1 Knapsack with weights = [1, 3], values = [10, 20], capacity = 3?
let weights = vec![1, 3];
let values = vec![10, 20];
let capacity = 3;
let n = weights.len();
let mut dp = vec![vec![0; capacity + 1]; n + 1];
for i in 1..=n {
    for w in 0..=capacity {
        if weights[i - 1] <= w {
            dp[i][w] = dp[i - 1][w].max(dp[i - 1][w - weights[i - 1]] + values[i - 1]);
        } else {
            dp[i][w] = dp[i - 1][w];
        }
    }
}
println!("{}", dp[n][capacity]);
medium
A. 30
B. 20
C. 10
D. 0

Solution

  1. Step 1: Trace DP table filling for each item and capacity

    For i=1 (weight=1, value=10): dp[1][1..3] = 10. For i=2 (weight=3, value=20): dp[2][3] = max(dp[1][3], dp[1][0]+20) = max(10, 20) = 20; dp[2][1..2] = dp[1][1..2] = 10.
  2. Step 2: Check final dp[n][capacity]

    At capacity=3, dp[2][3] = max(10, 20) = 20, but also consider if both items fit: weight sum=4 > 3, so only one item can be chosen. The best is item 2 with value 20 or item 1 with value 10. But wait, item 1 weight=1 and item 2 weight=3, capacity=3, so only one item fits. The max value is 20.
  3. Final Answer:

    20 -> Option B
  4. Quick Check:

    Max value with capacity 3 = 20 [OK]
Hint: Check if items fit capacity, pick max value [OK]
Common Mistakes:
  • Assuming both items fit when total weight exceeds capacity
  • Mixing up indices in dp table
  • Ignoring max function in dp update
4. Identify the bug in this Rust code snippet for 0 1 Knapsack and select the fix:
let weights = vec![2, 3];
let values = vec![40, 50];
let capacity = 5;
let n = weights.len();
let mut dp = vec![vec![0; capacity + 1]; n + 1];
for i in 1..=n {
    for w in 1..=capacity {
        if weights[i] <= w {
            dp[i][w] = dp[i - 1][w].max(dp[i - 1][w - weights[i]] + values[i]);
        } else {
            dp[i][w] = dp[i - 1][w];
        }
    }
}
println!("{}", dp[n][capacity]);
medium
A. Change weights[i] to weights[i - 1] and values[i] to values[i - 1]
B. Change loop to for i in 0..n
C. Initialize dp with zeros using dp = vec![0; n + 1]
D. Change capacity to capacity - 1 in inner loop

Solution

  1. Step 1: Identify index out of bounds error

    Rust vectors are zero-indexed, but code uses weights[i] and values[i] where i starts from 1, causing out-of-bounds access.
  2. Step 2: Fix indexing to zero-based

    Change weights[i] and values[i] to weights[i - 1] and values[i - 1] to access correct elements.
  3. Final Answer:

    Change weights[i] to weights[i - 1] and values[i] to values[i - 1] -> Option A
  4. Quick Check:

    Correct zero-based indexing fixes error [OK]
Hint: Use i-1 for zero-based vector indexing [OK]
Common Mistakes:
  • Using 1-based indexing on zero-based vectors
  • Incorrect loop ranges causing panic
  • Wrong dp initialization size
5. Given items with weights = [2, 3, 4, 5], values = [3, 4, 5, 6], and capacity = 5, what is the maximum value achievable using 0 1 Knapsack?
hard
A. 6
B. 9
C. 10
D. 7

Solution

  1. Step 1: Evaluate possible item combinations within capacity

    Check items that fit in capacity 5: - Item 1 (weight 2, value 3) - Item 2 (weight 3, value 4) - Item 3 (weight 4, value 5) - Item 4 (weight 5, value 6) Possible pairs: - Items 1+2: weight 5, value 7 - Items 1+3: weight 6 (too heavy) - Items 2+3: weight 7 (too heavy) - Item 4 alone: weight 5, value 6
  2. Step 2: Choose combination with highest value under capacity

    Best is items 1 and 2 with total value 7 and weight exactly 5.
  3. Final Answer:

    7 -> Option D
  4. Quick Check:

    Max value with capacity 5 = 7 [OK]
Hint: Try all item combos fitting capacity, pick max value [OK]
Common Mistakes:
  • Choosing single highest value item ignoring weight
  • Adding items exceeding capacity
  • Forgetting to check pairs or subsets
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