###### tags: `ADA 7.3` # ADA 7.3: Coin Changing 找零錢問題 # Greedy #2: Coin Changing Textbook Exercise 16.1 # Coin Changing Problem 題目解說 - Input: n dollars and unlimited coins with values $\{v_i\}(1, 5, 10, 50)$ - 輸入 n 塊錢和 $\{v_i\}(1, 5, 10, 50)$ 每種幣值都無限的 - Output: the minimum number of coins with the total value n - 如何用最少的硬幣湊出 n - **Cashier’s algorithm**: at each iteration, add the coin with the largest value no more than the current total - 從最大但不超過現在金額的幣值開始給,例如 n = 46 - 店員會找你 4 個 10 元 - 剩下 6 元找給你,1 個 5 元 - 剩下 1 元找給你,1 個 1 元 :::info 💡 用這個方法就可以拿到 OPT 嗎? 要怎麼證明呢? ::: # Step 1: Cast Optimization Problem :::info 💡 Coin Changing Problem Input: n dollars and unlimited coins with values $\{v_i\}(1, 5, 10, 50)$ Output: the minimum number of coins with the total value n ::: 先分析出我們的 Subproblem - Subproblems - C(i): 湊出 金額 i 需要的最小的硬幣數量 - 目標: 得到 C(n) # Step 2: Prove Optimal Substructure 如何證明 Optimal Substructure ? - 假設 OPT 是 C(i) 的一個 optimal solution,有以下四種情況(四種幣值): - Case 1: 第一個硬幣在 OPT 裡面 - 把第一個硬幣從 OPT 裡面拿掉的話,他就一定會是 i 減掉第一個硬幣的 金額 的 optimal solution → $c(i-v_1)$ - 證明:如果存在一個更好的 solution 可以湊出 $c(i-v_1)$ ,這樣就可以用這個更好的 solution 配上第一個硬幣,就會得到一個更好的 C(i),這件事情就矛盾了,所以這件事情必定成立。 - Case 2: 第二個硬幣在 OPT 裡面 - 把第二個硬幣從 OPT 裡面拿掉的話,他就一定會是 i 減掉第二個硬幣的 value 的 optimal solution → $c(i-v_2)$ - Case 3: 第三個硬幣在 OPT 裡面 - 把第三個硬幣從 OPT 裡面拿掉的話,他就一定會是 i 減掉第三個硬幣的 value 的 optimal solution → $c(i-v_3)$ - Case 4: 第四個硬幣在 OPT 裡面 - 把第四個硬幣從 OPT 裡面拿掉的話,他就一定會是 i 減掉第四個硬幣的 value 的 optimal solution → $c(i-v_4)$ :::info 💡 $C_i = min_j(1+C_{i-v_j})$ $C_i$ 就要追求這四種數值最小的那個 例如: $C_{28} = min_{10}(2+C_{28-20})$ $C_8 = min_5(1+C_{8-5})$ $C_3=min_1(3+C_{3-3})$ $C_{28} = min_{10}(2)+min_5(1)+min_1(3)$ ::: # Step 3: Prove Greedy-Choice Property 說明 Greedy-Choice Property 成立 - Greedy choice: 選擇最大的幣值但不超過現在的金額 - 利用矛盾法證明(用 10 ≤ i < 50 例子) - 我們有個 OPT 可以湊出 i ,greedy choice 要湊出 i 的話一定會拿 10 這個幣值 - 假設沒有任何 OPT 是包含 10 這個幣值的話 → 那麼所有的 OPT 就只能選擇剩下的這幾個 1, 5, 50 來湊成 i - 首先先把 50 去掉了,因為他超過 i 了 - 如果 OPT 裡面存在 兩個 5 的話,我一定可以把它換成一個 10 變成一個更好的 OPT,所以這裡最多只會存在一個 5 - 如果 OPT 裡面存在 五個 1,我一定可以把它換成一個 5 變成一個更好的 OPT,所以這裡最多只會存在四個 1 - 那麼在這個限制之下我最多只能湊出 9 塊錢 (5 + 4 = 9) - 這樣就跟一開始的 10 ≤ i < 50 是矛盾的 - 這就說明了我們可以直接把小於 i 但數值最大的硬幣放到 OPT 裡面,就可以帶領我們找到最終的 OPT。