New Zealand currency consists of $100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 10c and 5c coins. Write a program that will determine, for any given amount, in how many ways that amount may be made up. Changing the order of listing does not increase the count. Thus 20c may be made up in 4 ways: 1
20c, 2
10c, 10c+2
5c, and 4
5c.
Input
Input will consist of a series of real numbers no greater than $50.00 each on a separate line. Each amount will be valid, that is will be a multiple of 5c. The file will be terminated by a line containing zero (0.00).
Output
Output will consist of a line for each of the amounts in the input, each line consisting of the amount of money (with two decimal places and right justified in a field of width 5), followed by the number of ways in which that amount may be made up, right justified in a field of width 12.
Sample input
0.20
2.00
0.00
Sample output
0.20 4
2.00 293
典型的動(dòng)態(tài)規(guī)劃問(wèn)題:
可以先考慮只有n-1種硬幣,V1,V2,V3,---Vn-1.設(shè)湊成總值為M的方法數(shù)為result[M];
現(xiàn)在又添加一種面值為Vn的硬幣。
則咱們需要修改一些值,修改那些大于等于Vn的result[],不妨設(shè)M大于vn。
新result[M]=原result[M]+result[M-Vn]+result[M-2*Vn]+----直到M-p*Vn<=0;(1)
實(shí)際上如果如(2)那樣處理 從大于等于Vn的result[]開(kāi)始處理的話,從小到大,設(shè)Vn=M-p*Vn;
則result[M-p*Vn]第一個(gè)最先更新,result[M-p*Vn]+=result[M-p*Vn -Vn] 見(jiàn)(2)
隨后更新result[M-(p-1)*vn],則只需直接加上result[M-p*Vn]的值,無(wú)需如(1)式那樣 累加。
用程序表達(dá)就是
int coin[10]={5,10,20,50,100,200,500,1000,2000,5000};
for(i=1;i<10;i++)
for(j=coin[i];j<=50000;j+=5)
result[j]+=result[j-Coin[i]]; (2) //
-------------
還有一個(gè)注意點(diǎn),見(jiàn)牛人博客,http://hi.baidu.com/piaoshi111/blog/item/9a6de84a00a6e5f882025c89.html
就是浮點(diǎn)數(shù)的四舍五入,
1.5,浮點(diǎn)數(shù)可能表為1.4999999,所以乘以100時(shí)轉(zhuǎn)化為整型是149,應(yīng)當(dāng)注意。
posted on 2009-07-19 21:45
luis 閱讀(487)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
動(dòng)態(tài)規(guī)劃