The greedy approach makes the best choice at each step, hoping to find the overall best solution by building it piece by piece.
Click to reveal answer
beginner
What does Dynamic Programming (DP) do differently from greedy?
DP solves problems by breaking them into smaller overlapping subproblems, solving each once, and storing results to avoid repeated work.
Click to reveal answer
intermediate
When should you use a greedy algorithm instead of DP?
Use greedy when the problem has the 'greedy choice property' and 'optimal substructure', meaning local best choices lead to a global best solution.
Click to reveal answer
beginner
What is the 'optimal substructure' property?
A problem has optimal substructure if an optimal solution can be built from optimal solutions of its subproblems.
Click to reveal answer
intermediate
How can you check if a problem needs DP instead of greedy?
If making a local best choice does not guarantee a global best solution, and subproblems overlap, DP is usually needed.
Click to reveal answer
Which property must a problem have for a greedy algorithm to work correctly?
AGreedy choice property
BOverlapping subproblems
CMemoization
DBacktracking
✗ Incorrect
The greedy choice property means local optimal choices lead to a global optimum, which is essential for greedy algorithms.
What does Dynamic Programming use to avoid repeated work?
AGreedy choices
BMemoization or tabulation
CRandom guessing
DDivide and conquer without overlap
✗ Incorrect
DP stores results of subproblems using memoization or tabulation to avoid solving the same problem multiple times.
If a problem has overlapping subproblems and no greedy choice property, which approach is best?
AGreedy
BDivide and conquer
CBrute force
DDynamic Programming
✗ Incorrect
DP handles overlapping subproblems well and is suitable when greedy choices don't guarantee optimal solutions.
Which of these is an example of a greedy algorithm problem?
AActivity selection problem
BLongest common subsequence
CCoin change with unlimited coins
DKnapsack 0/1 problem
✗ Incorrect
Activity selection problem can be solved optimally by choosing the earliest finishing activity greedily.
What is a sign that a problem might require DP?
ANo overlapping subproblems
BLocal choices always lead to global optimum
CSubproblems overlap and optimal substructure exists
DProblem size is very small
✗ Incorrect
DP is useful when subproblems overlap and the problem has optimal substructure.
Explain how to decide between using a greedy algorithm or dynamic programming for a problem.
Think about how the problem breaks down and if local best choices are enough.
You got /5 concepts.
Describe the key differences between greedy algorithms and dynamic programming.
Focus on how each method approaches problem solving.
You got /5 concepts.
Practice
(1/5)
1. Which of the following best describes when to use a greedy algorithm instead of dynamic programming?
easy
A. When the problem has optimal substructure and no overlapping subproblems
B. When the problem has overlapping subproblems and requires memoization
C. When the problem requires checking all possible combinations
D. When the problem involves sorting large datasets
Solution
Step 1: Understand greedy algorithm conditions
Greedy algorithms work when choosing the best option at each step leads to a global optimum, which means the problem has optimal substructure and no overlapping subproblems.
Step 2: Compare with dynamic programming conditions
Dynamic programming is used when problems have overlapping subproblems and require storing intermediate results (memoization) to avoid repeated work.
Final Answer:
When the problem has optimal substructure and no overlapping subproblems -> Option A
Quick Check:
Greedy = optimal substructure + no overlap [OK]
Hint: Use greedy if no overlapping subproblems exist [OK]
Common Mistakes:
Confusing overlapping subproblems as a greedy condition
Thinking greedy always finds the best solution
Using dynamic programming when greedy suffices
2. Which of the following Python code snippets correctly initializes a memoization dictionary for dynamic programming?
easy
A. memo = []
B. memo = {}
C. memo = set()
D. memo = 0
Solution
Step 1: Identify the correct data structure for memoization
Memoization requires storing key-value pairs of subproblem results, so a dictionary (hash map) is appropriate.
Step 2: Check the options
memo = {} initializes an empty dictionary, which is correct. Lists or sets do not store key-value pairs, and an integer cannot store multiple results.
Final Answer:
memo = {} -> Option B
Quick Check:
Memoization uses dictionary = {} [OK]
Hint: Use {} to store subproblem results in DP [OK]
Common Mistakes:
Using list or set instead of dictionary for memo
Initializing memo as a number
Confusing data structures for memoization
3. What is the output of the following Python code that uses a greedy approach to select intervals?
intervals = [(1, 3), (2, 5), (4, 7)]
intervals.sort(key=lambda x: x[1])
selected = []
end = 0
for start, finish in intervals:
if start >= end:
selected.append((start, finish))
end = finish
print(selected)
medium
A. [(1, 3), (2, 5)]
B. [(2, 5), (4, 7)]
C. [(1, 3), (4, 7)]
D. [(1, 3), (2, 5), (4, 7)]
Solution
Step 1: Sort intervals by finish time
Sorted intervals: [(1, 3), (2, 5), (4, 7)]
Step 2: Select intervals greedily
Start with end=0. (1,3) start=1 >=0, select it, end=3. Next (2,5) start=2 <3 skip. Next (4,7) start=4 >=3 select it.
Final Answer:
[(1, 3), (4, 7)] -> Option C
Quick Check:
Greedy interval selection = [(1, 3), (4, 7)] [OK]
Hint: Sort by finish time, pick earliest finishing intervals [OK]
Common Mistakes:
Not sorting intervals by finish time
Selecting overlapping intervals
Appending intervals without condition
4. The following code attempts to solve the Fibonacci sequence using dynamic programming but has a bug. What is the error?
def fib(n, memo={}):
if n in memo:
return memo[n]
if n <= 1:
return n
memo[n] = fib(n-1) + fib(n-2)
return memo[n]
print(fib(5))
medium
A. Mutable default argument causes incorrect memoization across calls
B. Missing base case for n=0
C. Incorrect recursive calls fib(n-1) and fib(n-2)
D. Memo dictionary is not updated
Solution
Step 1: Identify the use of mutable default argument
The function uses memo={} as a default argument, which is mutable and shared across calls, causing unexpected behavior if fib is called multiple times.
Step 2: Explain why this is a bug
This can cause memo to retain values from previous calls, leading to incorrect results or memory issues.
Final Answer:
Mutable default argument causes incorrect memoization across calls -> Option A
Quick Check:
Mutable default dict in function = bug [OK]
Hint: Avoid mutable defaults like dict in function args [OK]
Common Mistakes:
Ignoring mutable default argument issue
Thinking base cases are missing
Assuming memo is not updated
5. You want to find the minimum number of coins to make a target amount using coin denominations [1, 3, 4]. Which approach is best and why?
A greedy approach picks the largest coin first. Dynamic programming tries all combinations. Which is correct?
hard
A. Neither approach works for coin change problems
B. Greedy always works because picking largest coin reduces count
C. Greedy and dynamic programming give the same result here
D. Dynamic programming is needed because greedy fails for some amounts
Solution
Step 1: Understand greedy approach limitation
Greedy picks largest coin first, but for amount 6, greedy picks 4+1+1=3 coins, but optimal is 3+3=2 coins.
Step 2: Recognize dynamic programming advantage
Dynamic programming tries all combinations and finds minimum coins, handling cases where greedy fails.
Final Answer:
Dynamic programming is needed because greedy fails for some amounts -> Option D
Quick Check:
Coin change needs DP, greedy can fail [OK]
Hint: Use DP for coin change; greedy can fail [OK]
Common Mistakes:
Assuming greedy always finds minimum coins
Ignoring counterexamples where greedy fails
Thinking coin change is always greedy
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.