# Greedy(貪心演算法) ---- ## 演算法? ## 聽起來很難 ---- ## Q:什麼是greedy? ### A:每次都採取目前看起來最好的選擇 ---- # 教完了 uwu ---- # 範例 ## 找零問題 ---- #### 有面額 1、5、10、50的硬幣 #### 現在給你某個金額 #### 求最少需要多少硬幣才能組成上述的金額 #### ex: 56(3) ---- ## 不難發現最佳策略 #### 先用大的面額,直到剩下的金額比那個面額大 ---- ## 舉例: 498元 ## 先用50元 可取450元(剩48元) ## 再用10元 可取40元(剩8元) ## 再用5元 可取5元(剩3元) ## 最後用1元 取最後3元 ## 總共用了 9+4+1+3 = 17枚硬幣 ---- ```cpp= #include<iostream> using namespace std; int coin[4] = {50, 10, 5, 1}; int main(){ int n, ans; cin >> n; for(int i = 0; i < 4; i++){ ans += n/coin[i]; n %= coin[i]; } if(n==0) cout << ans << '\n'; else cout << "wtf\n"; } ``` ---- # 但是 ---- ## 如果增加一個面額為9元的硬幣 ## 還可以用greedy嗎? ---- ## 假設要換28元 ## greedy: 2\*10 + 1\*5 + 3*1 ## ans: 6枚 ---- ## 但其實最佳解是 ## 1\*10 + 2*9 ## 3枚 ---- # 所以 ## greedy不一定可以求出最佳解 #### greedy解不出來可以用dp解決(林士紘下次會教) ---- ## 練習題 ## CSDC #267 #### (因為我懶得出題,進階組的再寫一次吧) ---- ## ans ```cpp= #include<bits/stdc++.h> using namespace std; int main() { int p, total = 0; cin >> p; int arr[6] = {500, 100, 50, 10, 5, 1}; p = 1000*(p/1000+1)-p; for(int i = 0; i < 6; i++) { if(p>=arr[i]) { total += p/arr[i]; p%=arr[i]; } } cout << total << '\n'; }```
{"metaMigratedAt":"2023-06-18T02:27:25.208Z","metaMigratedFrom":"YAML","title":"Greedy(貪心演算法)","breaks":true,"contributors":"[{\"id\":\"4fa49699-4204-4853-a27b-42a118fdac82\",\"add\":9919,\"del\":8621}]"}
    101 views