問題描述:
當前有面值分別為2角5分,1角,5分,1分的硬幣,請給出找n分錢的最佳方案(要求找出的硬幣數目最少)
問題分析:
根據常識,我們到店裡買東西找錢時,老闆總是先給我們最大面值的,要是不夠再找面值小一點的,直到找滿為止。如果老闆都給你找分數的或者幾角的,那你肯定不幹,另外,他也可能沒有那麼多零碎的錢給你找。其實這就是一個典型的貪心選擇問題。
問題的演算法設計與實現:
先舉個例子,假如老闆要找給我99分錢,他有上面的面值分別為25,10,5,1的硬幣數,為了找給我最少的硬幣數,那麼他是不是該這樣找呢,先看看該找多少個25分的,誒99/25=3,好像是3個,要是4個的話,我們還得再給老闆一個1分的,我不幹,那麼老闆只能給我3個25分的拉,由於還少給我24,所以還得給我2個10分的和4個1分。
具體實現
//找零錢演算法<br />//輸入:數組m,依次存放從大到小排列的面值數,n為需要找的錢數,單位全部為分<br />//輸出:數組num,對照數組m中的面值存放不同面值的硬幣的個數,就找錢方案<br /> public static int[] zhaoqian(int m[],int n)<br /> {<br /> int k=m.length;<br /> int[] num=new int[k];<br /> for(int i=0;i<k;i++)<br /> {<br /> num<i>=n/m<i>;<br /> n=n%m<i>;<br /> }<br /> return num;<br /> }<br />
public class zhaoqian<br />{<br /> public static void main(String[] args)<br /> {<br /> int m[]={25,10,5,1};<br /> int n=99;<br /> int[] num=new int[m.length];<br /> num=zhaoqian(m,n);<br /> System.out.println(n+"的找錢方案:");<br /> for(int i=0;i<m.length;i++)<br /> System.out.println(num<i>+"枚"+m<i>+"面值");<br /> }<br /> public static int[] zhaoqian(int m[],int n)<br /> {<br /> int k=m.length;<br /> int[] num=new int[k];<br /> for(int i=0;i<k;i++)<br /> {<br /> num<i>=n/m<i>;<br /> n=n%m<i>;<br /> }<br /> return num;<br /> }<br />}<br />