Dollars

題目鏈接:

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章