Bird
Raised Fist0
DSA Cprogramming~5 mins

DP vs Recursion vs Greedy Choosing the Right Tool in DSA C - Key Differences

Choose your learning style10 modes available
Recall & Review
beginner
What is recursion in problem solving?
Recursion is a method where a function calls itself to solve smaller parts of a problem until it reaches a simple base case.
Click to reveal answer
beginner
What does DP (Dynamic Programming) help with?
DP helps solve problems by breaking them into smaller overlapping subproblems and storing their results to avoid repeated work.
Click to reveal answer
beginner
When is a greedy algorithm the right choice?
A greedy algorithm works well when choosing the best option at each step leads to a global best solution without needing to reconsider choices.
Click to reveal answer
intermediate
How do you decide between recursion and DP?
If subproblems overlap and repeat, use DP to save results. If subproblems are independent, simple recursion may be enough.
Click to reveal answer
intermediate
Why might greedy algorithms fail sometimes?
Greedy algorithms can fail if local best choices do not lead to the best overall solution, especially when future steps depend on past decisions.
Click to reveal answer
Which approach stores results of subproblems to avoid repeated work?
ADynamic Programming
BRecursion without memoization
CGreedy Algorithm
DBrute Force
When is a greedy algorithm most suitable?
AWhen recursion depth is too large
BWhen subproblems overlap
CWhen local choices lead to global optimum
DWhen all solutions must be checked
What is a base case in recursion?
AA greedy choice
BThe simplest problem that stops recursion
CA repeated subproblem
DThe largest problem to solve
Which method is best if subproblems do NOT overlap?
ASimple Recursion
BDynamic Programming
CGreedy Algorithm
DBacktracking
Why might DP be preferred over recursion?
ATo increase recursion depth
BTo make greedy choices
CTo ignore base cases
DTo avoid repeated calculations of the same subproblems
Explain how to choose between recursion, dynamic programming, and greedy algorithms for a problem.
Think about problem structure and if subproblems repeat or if local choices are enough.
You got /3 concepts.
    Describe a real-life example where a greedy algorithm works well and one where it fails.
    Consider simple daily decisions vs complex ones needing full planning.
    You got /2 concepts.

      Practice

      (1/5)
      1. Which approach is best suited when a problem has overlapping subproblems and optimal substructure?
      easy
      A. Dynamic Programming
      B. Greedy Algorithm
      C. Simple Recursion without memoization
      D. Brute Force

      Solution

      1. Step 1: Understand problem characteristics

        Overlapping subproblems mean the same smaller problems repeat. Optimal substructure means the best solution can be built from best solutions of smaller problems.
      2. Step 2: Match approach to characteristics

        Dynamic Programming stores results of subproblems to avoid repeated work, ideal for overlapping subproblems and optimal substructure.
      3. Final Answer:

        Dynamic Programming -> Option A
      4. Quick Check:

        Overlapping subproblems + optimal substructure = Dynamic Programming [OK]
      Hint: Use DP when subproblems repeat and build optimal solutions [OK]
      Common Mistakes:
      • Choosing greedy when subproblems overlap
      • Using simple recursion without memoization causing slow code
      • Confusing optimal substructure with greedy choice property
      2. Which of the following is the correct syntax to implement memoization in C for a recursive Fibonacci function?
      easy
      A. Use a global array to store results and check before recursive calls
      B. Use a local variable inside the function to store results
      C. Use a static variable without initialization inside the function
      D. Use a pointer without allocating memory for memoization

      Solution

      1. Step 1: Understand memoization storage

        Memoization requires storing results outside the recursive calls to reuse them. A global or static array is suitable.
      2. Step 2: Check options for correct usage

        Only a global array checked before recursion ensures stored results are reused properly. Local variables reset each call, static without init may cause errors, pointers need allocation.
      3. Final Answer:

        Use a global array to store results and check before recursive calls -> Option A
      4. Quick Check:

        Memoization needs persistent storage = global array [OK]
      Hint: Memoize with global/static array checked before recursion [OK]
      Common Mistakes:
      • Using local variables that reset each call
      • Not initializing static variables properly
      • Using pointers without memory allocation
      3. What will be the output of the following C code snippet implementing a greedy approach for coin change?
      int coins[] = {25, 10, 5, 1};
      int amount = 30;
      int count = 0;
      for (int i = 0; i < 4; i++) {
          while (amount >= coins[i]) {
              amount -= coins[i];
              count++;
          }
      }
      printf("%d\n", count);
      medium
      A. 3
      B. 2
      C. 4
      D. 5

      Solution

      1. Step 1: Trace the greedy coin selection

        Start with 30 amount. Use 25 coin once (30-25=5), count=1. Then 10 coin can't be used (5<10). Use 5 coin once (5-5=0), count=2.
      2. Step 2: Count total coins used

        Coins used: 25 (1), 5 (1), total count = 2 coins. The code increments count inside while loop, so count=2.
      3. Step 3: Check for remaining coins

        Amount is now 0, so no more coins used.
      4. Final Answer:

        2 -> Option B
      5. Quick Check:

        Greedy coin count for 30 = 2 coins [OK]
      Hint: Subtract largest coin repeatedly until amount zero [OK]
      Common Mistakes:
      • Counting coins incorrectly by missing loops
      • Assuming greedy always gives minimum coins
      • Confusing coin values and counts
      4. Identify the error in this recursive function for factorial and suggest the fix:
      int factorial(int n) {
          if (n == 0) return 0;
          return n * factorial(n - 1);
      }
      medium
      A. Recursive call should be factorial(n + 1)
      B. Function should return void
      C. Base case should return 1 instead of 0
      D. No error, code is correct

      Solution

      1. Step 1: Analyze base case correctness

        Factorial of 0 is 1, but code returns 0, which will cause all results to be zero.
      2. Step 2: Suggest correct base case

        Change base case to return 1 when n == 0 to correctly end recursion and compute factorial.
      3. Final Answer:

        Base case should return 1 instead of 0 -> Option C
      4. Quick Check:

        Factorial(0) = 1 base case [OK]
      Hint: Factorial base case returns 1, not 0 [OK]
      Common Mistakes:
      • Returning 0 in base case causing zero product
      • Changing recursion direction incorrectly
      • Ignoring base case leading to infinite recursion
      5. You want to find the minimum number of coins to make a given amount using coins of denominations {1, 3, 4}. Which approach is best and why?
      hard
      A. Brute force, to try all combinations without optimization
      B. Recursion without memoization, to explore all possibilities
      C. Greedy, because always picking largest coin works
      D. Dynamic Programming, to store and reuse subproblem results

      Solution

      1. Step 1: Understand problem requirements

        Minimum coins for amount with coins {1,3,4} needs checking all combinations to find optimal solution.
      2. Step 2: Evaluate approaches

        Greedy fails here because picking largest coin first may not yield minimum coins. Recursion without memoization is slow. Dynamic Programming stores results of smaller amounts to build optimal solution efficiently.
      3. Final Answer:

        Dynamic Programming, to store and reuse subproblem results -> Option D
      4. Quick Check:

        Minimum coins with overlapping subproblems = DP [OK]
      Hint: Use DP when greedy fails to find minimum coins [OK]
      Common Mistakes:
      • Assuming greedy always works for coin change
      • Using recursion without memo causing slow code
      • Ignoring overlapping subproblems in coin change
      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