貪心演算法實現找零問題求解
阿新 • • 發佈:2019-01-22
貪心演算法就是,每一步選擇一個最優解,最後實現整體的最優解,即通過區域性的不斷最優實現整體的最優。有時候貪心演算法的結果並不是最優的解,十分接近最優解,這樣的問題同樣可以採用貪心演算法。
/** 貪心演算法計算最為合適的找零問題。例如需要找2.7元,目前可選的硬幣為1元,5角,1角。 怎樣找零可以使硬幣的數量最小 */ ///可以找零返回1,找零失敗返回0,引數為money,需要找零的總數, choice為可以的選擇,從0到索引的最大值 ///依次由大到小存放,e.g. choice[0]存放1元需要的個數,choice[1]存放5角需要的個數 #include <stdio.h> #define PRECITION 0.00001 int bestchange(double money, int choice[]){ if((money > -PRECITION) && (money < PRECITION)) return 1;//找零結束 while(money + PRECITION >= 0.1){ if(money + PRECITION >= 1){ money = money - 1; choice[0]++; return bestchange(money, choice); }else if(money + PRECITION>= 0.5){ money -= 0.5; choice[1]++; return bestchange(money, choice); }else if(money + PRECITION >= 0.1){ money -= 0.1; choice[2]++; return bestchange(money, choice); } } return 0; } //輸出陣列的函式 void printdata(int data[], int n){ //n代表陣列元素的個數 int i; for(i = 0; i < n; i++){ printf("%d\t", data[i]); } } void main(){ double money = 2.3; int result; int choice[] = {0, 0, 0};//用於存放每個硬幣的個數,choice[0]存放1元的個數,choice[1]存放0.5元的個數,choice[2]存放0.1元的個數 result = bestchange(money, choice); printdata(choice, 3); printf("\nresult:\t%d\n", result); getchar(); }
由於在儲存時的近似處理,浮點數的相等大於小於判斷比較糾結, 所以引入了一個PRECITION作為精度(可能用詞不當)。
還有一個方法就是可以將money*10然後再進行處理,test = 10 * money;