The greedy choice property is the foundation of every greedy algorithm. It's the single property that determines whether greedy works or fails.
Yet most developers can't define it clearly. They code greedy solutions without understanding why they work—or when they'll fail.
This guide teaches you the greedy choice property: what it is, how to identify it, how to prove it, and most importantly, how to recognize when it fails.
TL;DR
Greedy Choice Property: A globally optimal solution can be arrived at by making a locally optimal (greedy) choice.
In simple terms: The best immediate choice leads to the best overall solution.
How to prove it:
- Define the greedy choice
- Assume an optimal solution exists
- Show the optimal solution can include the greedy choice
- Conclude: greedy choice is safe
When it fails: Coin Change (arbitrary denominations), 0/1 Knapsack
Definition of Greedy Choice Property
Formal Definition
Greedy Choice Property: For an optimization problem, if we make a choice that looks best at the moment (locally optimal), we can still reach a globally optimal solution.
Mathematical formulation:
∃ optimal solution S such that:
S includes the greedy choice gIn other words: The greedy choice is always part of some optimal solution (not necessarily all optimal solutions, but at least one).
What This Means
Greedy works when:
- Making the best immediate choice doesn't block you from the best overall solution
- Local optimality implies global optimality
Greedy fails when:
- The best immediate choice can lead to a suboptimal overall solution
- Local optimality doesn't guarantee global optimality
Example: Activity Selection
Problem: Select maximum non-overlapping activities.
Greedy choice: Pick activity ending earliest.
Greedy choice property: There exists an optimal solution that includes the earliest-ending activity.
Why it holds: Picking earliest-ending leaves maximum room for future activities. Any optimal solution can be modified to include this choice.
How to Identify Greedy Choice Property
The Test: "Is Local Optimal Also Global Optimal?"
Ask yourself:
- What's the greedy choice? (What looks best right now?)
- Can I prove it's safe? (Will it be part of some optimal solution?)
- Can I find a counterexample? (Input where greedy fails?)
If you can prove it's safe AND find no counterexample → greedy works ✓
If you find a counterexample → greedy fails, use DP ✗
Step-by-Step Framework
Step 1: Define the greedy choice
What decision do you make at each step?
Examples:
- "Pick interval ending earliest"
- "Take coin with largest value"
- "Select item with highest value/weight ratio"Step 2: Assume an optimal solution
Let OPT = some optimal solution
(We don't know what it is, just that it's optimal)Step 3: Consider two cases
Case 1: Greedy choice is in OPT
→ Greedy choice property holds ✓
Case 2: Greedy choice is NOT in OPT
→ Try to modify OPT to include greedy choice
→ Prove modified solution is still optimal
→ If successful, greedy choice property holds ✓
→ If not, greedy choice property fails ✗Step 4: Conclude
If both cases work → Greedy choice property holds
If Case 2 fails → Find counterexample, use DPExample: Activity Selection
Problem Setup
Input: Activities with start and end times
Goal: Select maximum number of non-overlapping activities
Greedy choice: Pick activity that ends earliest
Proving Greedy Choice Property
Step 1: Define greedy choice
- Let g = activity with earliest end time among all activities
Step 2: Assume optimal solution
- Let OPT = {a₁, a₂, ..., aₖ} be an optimal solution
- Assume activities sorted by end time
Step 3: Two cases
Case 1: g ∈ OPT (g is in optimal solution)
- Greedy choice is already in OPT ✓
- Greedy choice property holds ✓
Case 2: g ∉ OPT (g is not in optimal solution)
- Let a₁ be the first activity in OPT
- Since g has earliest end time: end(g) ≤ end(a₁)
- Replace a₁ with g in OPT to get OPT'
- Claim: OPT' is still optimal
Proof that OPT' is optimal:
- g ends no later than a₁: end(g) ≤ end(a₁)
- All activities after a₁ in OPT are compatible with a₁ (no overlap)
- Since g ends earlier, they're also compatible with g
- |OPT'| = |OPT| (same number of activities)
- Therefore, OPT' is optimal ✓
Step 4: Conclusion
- In both cases, there exists an optimal solution containing g
- Greedy choice property holds ✓
- Greedy algorithm is correct ✓
Example: Fractional Knapsack
Problem Setup
Input: Items with values and weights, knapsack capacity
Goal: Maximize value (can take fractions of items)
Greedy choice: Take item with highest value/weight ratio
Proving Greedy Choice Property
Step 1: Define greedy choice
- Let g = item with highest value/weight ratio
Step 2: Assume optimal solution
- Let OPT = optimal solution (some combination of items/fractions)
Step 3: Two cases
Case 1: OPT includes full amount of g
- Greedy choice is in OPT ✓
Case 2: OPT doesn't include full amount of g
- OPT must include some other item i with lower ratio
- ratio(g) > ratio(i)
- Exchange: Replace ε weight of item i with ε weight of item g
- Remove ε of i: lose ε × ratio(i) value
- Add ε of g: gain ε × ratio(g) value
- Net gain: ε × (ratio(g) - ratio(i)) > 0
- Contradiction: OPT wasn't optimal ✗
Step 4: Conclusion
- OPT must include maximum amount of g
- Greedy choice property holds ✓
When Greedy Choice Property Fails
Example: Coin Change (Arbitrary Denominations)
Problem: Minimum coins to make change
Greedy choice: Take largest coin first
Coins: [1, 3, 4], Amount: 6
Testing greedy choice property:
Step 1: Greedy choice = coin 4 (largest)
Step 2: Assume optimal solution OPT
Step 3: Try to prove OPT can include coin 4
Attempt:
- Greedy: Take 4 → remaining 2 → take 1, 1 → total 3 coins
- Optimal: Take 3, 3 → total 2 coins
- Optimal does NOT include coin 4 ✗
Can we modify optimal to include 4?
- If we force coin 4 into optimal: [4, ?, ?]
- Remaining amount: 2
- Best we can do: [4, 1, 1] = 3 coins
- This is worse than optimal [3, 3] = 2 coins ✗
Step 4: Conclusion
- Greedy choice property FAILS ✗
- Greedy algorithm is INCORRECT for arbitrary coins
- Must use DP instead
Example: 0/1 Knapsack
Problem: Maximize value in knapsack (can't take fractions)
Greedy choice: Take item with highest value/weight ratio
Items: values=[60,100,120], weights=[10,20,30], capacity=50
Testing greedy choice property:
Greedy solution:
- Sort by ratio: [60/10=6, 100/20=5, 120/30=4]
- Take item 1 (ratio 6): weight=10, value=60
- Take item 2 (ratio 5): weight=20, value=100
- Total: weight=30, value=160
Optimal solution:
- Take item 2 and item 3: weight=50, value=220
Greedy choice property fails:
- Greedy choice (item 1) is NOT in optimal solution
- Can't modify optimal to include item 1 without making it worse
- Greedy choice property FAILS ✗
Common Mistakes in Proofs
Mistake 1: Assuming Without Proving
❌ Wrong:
Claim: Taking largest coin is optimal
Proof: Larger coins are better, so greedy works ✗
(This is circular reasoning, not a proof)✅ Correct:
Claim: Taking largest coin is optimal
Proof: Attempt to show optimal includes largest coin...
Counterexample: [1,3,4], amount=6
Greedy: [4,1,1]=3, Optimal: [3,3]=2
Claim is FALSE ✗Mistake 2: Ignoring Counterexamples
❌ Wrong:
"Greedy works on [1,5,10,25], so it always works" ✗✅ Correct:
"Greedy works on [1,5,10,25] (canonical system)
But fails on [1,3,4] (non-canonical)
Must test with various inputs" ✓Mistake 3: Confusing Optimal Substructure with Greedy Choice
❌ Wrong:
"Problem has optimal substructure, so greedy works" ✗
(DP also requires optimal substructure!)✅ Correct:
"Problem has optimal substructure AND greedy choice property
Therefore greedy works" ✓Quick Reference
| Problem | Greedy Choice | Property Holds? | Why? |
|---|---|---|---|
| Activity Selection | Earliest end time | ✅ Yes | Leaves max room for future |
| Fractional Knapsack | Highest ratio | ✅ Yes | Can take fractions, ratio optimal |
| Coin Change (US) | Largest coin | ✅ Yes | Canonical system |
| Coin Change (arbitrary) | Largest coin | ❌ No | Counterexample exists |
| 0/1 Knapsack | Highest ratio | ❌ No | Can't take fractions |
| Jump Game | Max reach | ✅ Yes | If unreachable with max, impossible |
Practice Strategy
To master greedy choice property:
- Solve Activity Selection - prove greedy choice property holds
- Try Coin Change - find counterexample where it fails
- Solve Fractional Knapsack - prove it holds
- Try 0/1 Knapsack - prove it fails
- For each problem: Explicitly identify and test greedy choice property
FAQ
Q: How do I know if greedy choice property holds?
A: Try to prove it (exchange argument or direct proof). If you can't, try to find a counterexample.
Q: Can a problem have greedy choice property for one greedy choice but not another?
A: Yes! For interval scheduling, "earliest end time" has the property, but "earliest start time" doesn't.
Q: Is greedy choice property the same as optimal substructure?
A: No. Optimal substructure means optimal solution contains optimal subproblems (required for both greedy AND DP). Greedy choice property means local optimal leads to global optimal (required only for greedy).
Conclusion
The greedy choice property is the foundation of all greedy algorithms.
Key takeaways:
- Definition: Local optimal choice leads to global optimal solution
- How to prove: Show optimal solution can include greedy choice
- How to test: Look for counterexamples
- When it fails: Use DP instead
The framework:
- Define greedy choice
- Assume optimal solution
- Show optimal can include greedy choice
- Conclude: property holds (or find counterexample)
Master this property, and you'll know exactly when greedy works vs when you need DP. For more proof techniques, see Greedy Proof Techniques, Exchange Argument Explained, and the complete greedy guide.
Next time you write a greedy solution, ask: "Does greedy choice property hold?"
Want to Practice LeetCode Smarter?
LeetCopilot is a free browser extension that enhances your LeetCode practice with AI-powered hints, personalized study notes, and realistic mock interviews — all designed to accelerate your coding interview preparation.
Also compatible with Edge, Brave, and Opera
