資料結構與演算法之貪心演算法 C++實現,資料結構與演算法貪心
1、基本思路:從問題的某一個初始解觸發逐步逼近給定的目標,以儘可能快的求得更好的解。當達到演算法中某一步不能再繼續前進時,就停止演算法,給出近似值。也就是說貪心演算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇。存在的問題:1、不能保證最後的解是最優的;2、不能用來求最大或最小解的問題;3、只能求滿足某些約束條件的可行解的範圍。實現過程: 從問題的某一初始解出發; while (能朝給定總目標前進一步) { 利用可行的決策,求出可行解的一個解元素; } 由所有解元素組合成問題的一個可行解;貪心演算法的基本要素:(對於一個具體的問題,怎麼知道是否可用貪心演算法解此問題)(1)、貪心選擇性質 所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列局部最優的選擇,換句話說,當考慮做何種選擇的時候,我們只考慮對當前問題最佳的選擇而不考慮子問題的結果。這是貪心演算法可行的第一個基本要素。對於一個具體問題,要確定它是否具有貪心選擇性質,必須證明每一步所作的貪心選擇最終導致問題的整體最優解。(2)、最優子結構性質當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。問題的最優子結構性質是該問題可用貪心演算法求解的關鍵特徵。執行個體:換零錢人民幣100、50、20、10、5、1、0.5、0.2、01多種紙幣。將一定數額的錢數用不能面額組合起來。代碼:
#include<iostream>const int SIZE = 9;int coin[SIZE] = {10000, 5000, 2000, 1000, 500, 100, 50, 20, 10};int num[SIZE];int exchange(int n);int main(){ using namespace std; double money; string name[SIZE] = {"一百元", "五十元", "二十元", "十元", "5元", "1元", "5角", "2角", "1角"}; cout << "請輸入金額:"; cin >> money; int n = (int)(money*100); exchange(n); for(int i=0; i<SIZE; i++) { cout << name[i] << "幣種: " << num[i] << " 張\n"; } return 0;}int exchange(int n){ int i; for (i=0; i<SIZE; i++) if (n >= coin[i]) break; while (n>0 && i<SIZE) { if(n >= coin[i]) { n -= coin[i]; num[i]++; }else if(n<10 && n>=5) { num[SIZE-1]++; break; }else i++; } return 0;}運行結果: