Bird
Raised Fist0
DSA Cprogramming~3 mins

Why Backtracking and What Greedy Cannot Solve in DSA C - The Real Reason

Choose your learning style10 modes available
The Big Idea

What if the fastest choice isn't the best one? Discover how backtracking finds the perfect path!

The Scenario

Imagine you are trying to find the best way to pack a suitcase with limited space, choosing items one by one. You try to pick the biggest or most valuable items first, hoping to fill the suitcase quickly.

The Problem

This quick choice method often fails because picking the biggest items first might leave no room for other valuable items. You might miss the best combination because you didn't check all possibilities carefully.

The Solution

Backtracking helps by trying all possible combinations step-by-step. It goes back and changes choices when it finds a dead end, ensuring you find the best solution instead of just a quick guess.

Before vs After
✗ Before
int pack_suitcase(int items[], int n, int capacity) {
    int total = 0;
    int space_left = capacity;
    for (int i = 0; i < n; i++) {
        if (items[i] <= space_left) {
            total += items[i];
            space_left -= items[i];
        }
    }
    return total;
}
✓ After
int backtrack_pack(int items[], int n, int index, int current_weight, int capacity) {
    if (index == n) return current_weight;
    int with_item = 0;
    if (current_weight + items[index] <= capacity) {
        with_item = backtrack_pack(items, n, index + 1, current_weight + items[index], capacity);
    }
    int without_item = backtrack_pack(items, n, index + 1, current_weight, capacity);
    return with_item > without_item ? with_item : without_item;
}
What It Enables

Backtracking enables finding the best solution by exploring all options, not just the obvious ones.

Real Life Example

Choosing the best route for a delivery truck that must visit many cities without wasting time or fuel.

Key Takeaways

Greedy methods make quick choices but can miss the best solution.

Backtracking tries all possibilities and corrects mistakes by going back.

Use backtracking when you need the best answer, not just a fast guess.

Practice

(1/5)
1. Why is backtracking preferred over greedy algorithms in problems like the N-Queens puzzle?
easy
A. Because backtracking explores all possible solutions and can backtrack on wrong choices
B. Because greedy algorithms always find the optimal solution quickly
C. Because backtracking uses less memory than greedy algorithms
D. Because greedy algorithms do not use recursion

Solution

  1. Step 1: Understand problem requirements

    The N-Queens puzzle requires placing queens so none attack each other, needing exploration of many possibilities.
  2. Step 2: Compare algorithm approaches

    Backtracking tries all options and undoes wrong choices, while greedy picks locally best choices that may fail globally.
  3. Final Answer:

    Because backtracking explores all possible solutions and can backtrack on wrong choices -> Option A
  4. Quick Check:

    Backtracking explores all options = A [OK]
Hint: Backtracking tries all paths; greedy picks local best only [OK]
Common Mistakes:
  • Thinking greedy always finds the best solution
  • Confusing memory use between backtracking and greedy
  • Assuming backtracking is always slower without context
2. Which of the following is the correct syntax to start a backtracking function in C for solving a problem recursively?
easy
A. int backtrack[] = {0};
B. void backtrack(int step) { /* code */ }
C. backtrack() -> void { /* code */ }
D. function backtrack(int step) { /* code */ }

Solution

  1. Step 1: Identify valid C function syntax

    In C, functions are declared with return type, name, and parameters inside parentheses.
  2. Step 2: Check each option

    A matches C syntax; B is an array declaration; C and D use non-C syntax.
  3. Final Answer:

    void backtrack(int step) { /* code */ } -> Option B
  4. Quick Check:

    C function syntax = A [OK]
Hint: C functions start with return type and parentheses [OK]
Common Mistakes:
  • Using JavaScript or other language syntax in C
  • Confusing arrays with functions
  • Omitting return type in function declaration
3. Consider the following C code snippet for a backtracking approach to find subsets of {1, 2}:
void backtrack(int start, int n) {
    if (start == n) {
        printf("Reached end\n");
        return;
    }
    backtrack(start + 1, n);
    backtrack(start + 1, n);
}
int main() {
    backtrack(0, 2);
    return 0;
}
What will be the output when this code runs?
medium
A. Reached end\n
B. Reached end\nReached end\n
C. Reached end\nReached end\nReached end\nReached end\n
D. No output

Solution

  1. Step 1: Trace recursive calls

    backtrack(0,2) calls backtrack(1,2) twice; each backtrack(1,2) calls backtrack(2,2) twice.
  2. Step 2: Count base case hits

    backtrack(2,2) prints "Reached end"; it is called 4 times total (2 calls from each of 2 calls at start=1).
  3. Final Answer:

    Reached end\nReached end\nReached end\nReached end\n -> Option C
  4. Quick Check:

    4 base calls print output = A [OK]
Hint: Count recursive calls reaching base case carefully [OK]
Common Mistakes:
  • Counting only one base case print
  • Confusing number of recursive calls
  • Ignoring duplicate calls in recursion
4. The following C code attempts to solve the subset sum problem using backtracking but has a bug:
void backtrack(int index, int sum, int target, int arr[], int n) {
    if (sum == target) {
        printf("Found subset\n");
        return;
    }
    if (index == n || sum > target) {
        return;
    }
    backtrack(index + 1, sum + arr[index], target, arr, n);
    backtrack(index + 1, sum, target, arr, n);
}
int main() {
    int arr[] = {2, 4, 6};
    backtrack(0, 0, 6, arr, 3);
    return 0;
}
What is the bug in this code?
medium
A. It does not print all subsets that sum to target
B. It does not check if sum exceeds target before recursion
C. It does not handle negative numbers in array
D. It does not stop recursion after finding one subset

Solution

  1. Step 1: Analyze base case for sum == target

    When sum equals target, it prints but continues recursion because no stop condition after printing.
  2. Step 2: Identify missing stop after success

    Function returns only from current call, but parent calls continue exploring other subsets.
  3. Final Answer:

    It does not stop recursion after finding one subset -> Option D
  4. Quick Check:

    Missing stop after success = B [OK]
Hint: Stop recursion immediately after finding a valid subset [OK]
Common Mistakes:
  • Assuming printing once stops all recursion
  • Ignoring need to return from all recursive calls
  • Confusing sum checks with recursion control
5. You want to solve the problem of finding all combinations of coins that sum to a target amount. Why can't a greedy algorithm always solve this correctly, and how does backtracking help? Choose the best explanation.
hard
A. Greedy picks largest coins first which may miss combinations; backtracking tries all coin choices systematically
B. Greedy uses more memory; backtracking uses less memory
C. Greedy is slower than backtracking for coin problems
D. Backtracking only tries one coin at a time, greedy tries all

Solution

  1. Step 1: Understand greedy approach limitation

    Greedy picks largest coin repeatedly, which can miss valid combinations with smaller coins.
  2. Step 2: Understand backtracking advantage

    Backtracking tries all coin combinations by exploring all choices and backtracking on failures.
  3. Final Answer:

    Greedy picks largest coins first which may miss combinations; backtracking tries all coin choices systematically -> Option A
  4. Quick Check:

    Greedy misses combos; backtracking explores all = A [OK]
Hint: Greedy misses combos; backtracking explores all systematically [OK]
Common Mistakes:
  • Assuming greedy always finds all solutions
  • Confusing memory use with correctness
  • Thinking backtracking is always slower without context
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