幣值為25分、10分、5分和1分的硬幣,計算n分有幾種表示方法
阿新 • • 發佈:2019-02-02
題目:《程式設計師面試金典(第5版)》P232
給定數量不限的硬幣,幣值為25分、10分、5分和1分,編寫程式碼計算n分有幾種表示方法。
提示:這是個遞迴問題,要找出如何利用子問題的答案進行計算。
從幣值大的硬幣開始,每次取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。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); }