題目鏈接:
https://vjudge.net/contest/348156#problem/F
題面:
翻譯:
新西蘭貨幣包括100美元、50美元、20美元、10美元和5美元紙幣以及2美元、1美元、50美分、20美分、10美分和5美分
硬幣。寫一個程序,它將確定,對於任何給定的數量,有多少方式
可能是編造的。更改列表順序不會增加計數。因此可以製造20
向上4個方式:1×20c、2×10c、10c+2×5c和4×5c。
輸入:
輸入將由一系列不超過300美元的實數組成,每個實數在一個單獨的行上。每個
金額將是有效的,即5c的倍數。文件將以包含
零(0.00)。
輸出:
輸出將包含輸入中每個金額的行,每個行包含金額
貨幣數量(小數點後兩位,在寬度爲6的字段中右對齊),後跟
在寬度爲17的區域中右對齊的金額的構成方式。
思路:
這道題目與https://blog.csdn.net/qq_45740533/article/details/103612924的思路差不多,這裏不一樣的是你首先要把美元全部轉換爲美分,使得不會出現小數,然後最後的金額也要轉換爲美分,而轉換爲美分要注意的是輸入的金額是實數,所以是無法確定輸入的這個數字是有幾位的,所以我們要確保轉換後爲整形,並且不影響最後的金額,我們就需要把金額先乘以100+0.5之後再強制轉換爲int型,這時候就不會使得最後的數在強制轉換後出現問題,再加上題目說了每個金額都是5c的倍數,最後轉換後就不會影響最後結果。
參考代碼:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int w[12]={5,10,20,50,100,200,500,1000,2000,5000,10000};
long long dp[35000];
int main()
{
double v;
while(scanf("%lf",&v)!=EOF&&v!=0.00)
{
long long i,j;
memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=0;i<11;i++)
{
for(j=w[i];j<=int(v*100+0.5);j++)
{
dp[j]=dp[j]+dp[j-w[i]];
}
}
printf("%6.2lf%17lld\n",v,dp[int(v*100+0.5)]);
}
return 0;
}