1. 程式人生 > >貪心演算法實現找零問題求解

貪心演算法實現找零問題求解

貪心演算法就是,每一步選擇一個最優解,最後實現整體的最優解,即通過區域性的不斷最優實現整體的最優。有時候貪心演算法的結果並不是最優的解,十分接近最優解,這樣的問題同樣可以採用貪心演算法。

/**
貪心演算法計算最為合適的找零問題。例如需要找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;