貪心算法是解決最優化問題的經典策略:每步做局部最優選擇,期望得到全局最優解。本文通過找零錢、活動安排問題,講解貪心選擇性質、最優子結構、與動態規劃的本質區別。
貪心算法:每步在當前狀態下做看起來最好的選擇,不回溯、不考慮子問題最優解。
動態規劃:基於子問題最優解構建全局最優,通常自底向上、有重疊子問題。
硬幣面值:0.25、0.10、0.05、0.01 元。找零 0.63 元。
貪心策略:每次取不超過剩餘金額的最大面值。
0.63 → 0.25 (剩 0.38) 0.38 → 0.25 (剩 0.13) 0.13 → 0.10 (剩 0.03) 0.03 → 0.01 × 3 共 6 枚硬幣(最優)
✅ 此面值體系下貪心得最優解。
反例:面值 0.11、0.10、0.01。找零 0.15。
貪心:0.11 + 0.01×4 = 5 枚 最優:0.10 + 0.05 (若無 0.05 則 0.10+0.01×5=6枚) 實際最優:0.10 + 0.01×5 = 6 枚?等等... 更好反例:面值 1、3、4。找零 6。 貪心:4+1+1 = 3 枚 最優:3+3 = 2 枚 ❌ 貪心失效
n 個活動 (s_i, f_i),選最大相容子集。貪心策略:按結束時間升序,每次選最早結束的相容活動。
證明框架(數學歸納法):
| 性質 | 含義 | 與動態規劃區別 |
|---|---|---|
| 貪心選擇性質 | 全局最優可通過一系列局部最優選擇達到 | 動態規劃選擇依賴子問題解;貪心不依賴未來、不依賴子問題解 |
| 最優子結構性質 | 問題最優解包含子問題最優解 | 兩者共同擁有,是可用 DP/貪心的前提 |