【UVA 147】【Dollars】

本文介绍了一种解决货币组合计数问题的算法,通过使用完全背包思想,计算给定金额下可能的货币组合数量。输入为一系列不超过$300.00的金额,输出为该金额所有可能的货币组合数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值