【UVA 147】【Dollars】

  • Post author:
  • Post category:其他


题目:

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 $300.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 6), followed by the number of ways in which that amount may be made up, right justified in a field of width 17.

Sample Input

0.20

2.00

0.00

Sample Output

0.20            4

2.00           293

题意:给出我们货币的种类,且数量无数,然后给出我们金额,问用这些种类的货币能有多少种组合方式达到这个金额。

解题思路:完全背包,因为数目不限,所以直接模板,注意一点就是如何处理小数的问题,我是直接开了一个数组,将货币金额扩大100倍,但是有一点我现在还没有想明白,就是为啥输入n之后,再对n扩大100倍之后,要加0.5(据说是要保证精度???)

(咨询过学长,是四舍五入,自己还在思考,有想明白的神犇可以教教我,等我理解了,会回来补更的)原谅我计算机系统基础学的不是很好,不过咱们可以开两个int类型的数字,在输入的时候直接%d.%d,不过在输出的时候需要注意格式。

ac代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 30008
using namespace std;
typedef long long ll;
int m[15]={10000,5000,2000,1000,500,200,100,50,20,10,5};
double n;
ll dp[maxn];
int main()
{
	while(scanf("%lf",&n)==1)
	{
		if(n==0)
			break;
		int mm=(n*100+0.5);//精度 四舍五入
		memset(dp,0,sizeof(dp));
		dp[0]=1;
		for(int i=0;i<11;i++)
			for(int j=m[i];j<=mm;j++)
			{
				if(dp[j-m[i]])
				{
					dp[j]+=dp[j-m[i]];	
				}
			 } 
		printf("%6.2f%17lld\n",n,dp[mm]);
	}
	return 0;
}



版权声明:本文为qq_42505741原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。