1. 程式人生 > >幣值為25分、10分、5分和1分的硬幣,計算n分有幾種表示方法

幣值為25分、10分、5分和1分的硬幣,計算n分有幾種表示方法

    題目:《程式設計師面試金典(第5版)》P232

    給定數量不限的硬幣,幣值為25分、10分、5分和1分,編寫程式碼計算n分有幾種表示方法。

    提示:這是個遞迴問題,要找出如何利用子問題的答案進行計算。

int MakeChangeCore(int n,int denom)
{
	int next_denom=0;
	switch(denom)
	{
	case 25:
		next_denom=10;
		break;
	case 10:
		next_denom=5;
		break;
	case 5:
		next_denom=1;
		break;
	case 1:
		return 1;
	}

	int res=0;
	for(int i=0;i*denom<=n;i++)
		res+=MakeChangeCore(n-i*denom,next_denom);

	return res;

}

int MakeChange(int n)
{
	if(n<=0)
	        return -1;
	return MakeChangeCore(n,25);
}
    從幣值大的硬幣開始,每次取i個(i乘以幣值要小於等於n), 然後接著去取幣值比它小的硬幣,這時就是它的一個子問題了,遞迴呼叫。 具體來怎麼來理解這個事呢?這樣,比如我要湊100分,那我先從25分開始, 我先取0個25分,然後遞迴呼叫去湊100分;再然後我取1個25分,然後遞迴呼叫去湊100-25 =75分;接著我取2個25分,遞迴呼叫去湊100-25*2=50分……這些取了若干個 25分硬幣然後再去遞迴呼叫,取的就是10分硬幣了。一直這樣操作下去,我們就會得到, 由若干個25,若干個10分,若干個5分和若干個1分組成的100分,而且, 這裡面每種幣值的數量都可以為0。