hdu 1284 分硬币 && uva 147
#include<bits/stdc++.h> using namespace std; int main() { unsigned long long int dp[32780]; memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=3;i++) for(int j=i;j<32780;j++) dp[j]=dp[j]+dp[j-i]; int n; while((scanf("%d",&n))!=EOF) { printf("%I64d\n",dp[n]); } return 0; return 0; }
这两道题基本思路是一样的,不过uva147的输出实在是个大坑,因为double的问题,所以考虑精度的损失。
代码中的输出部分被我注释掉的那一部分是错误的输出,格式什么的都是正确的,但是存在精度的损失。应该注意一下
hdu1284
Description
Input
Output
Sample Input
Sample Output
#include<bits/stdc++.h> using namespace std; int main() { unsigned long long int dp[30005]; int money[]={10000,5000,2000,1000,500,200,100,50,20,10,5}; memset(dp,0,sizeof(dp)); dp[0]=1; //cout<<money[10]<<endl; for(int i=10;i>=0;i--) { for(int j=money[i];j<30005;j++) { dp[j]=dp[j-money[i]]+dp[j]; } } //cout<<dp[0]<<dp[5]<<dp[10]<<dp[15]<<endl; double n; //cin>>n; //cout<<dp[5]<<endl; //cout<<dp[10020]<<endl; int a,b; while((scanf("%d.%d",&a,&b))!=EOF&&a+b) { /* n=n*100; cout<<n; int m=n; printf("%6.2lf%17I64d\n",n/100,dp[m]);*/ int n=a*100+b;//cout<<n<<endl; double ans=n*1.0/100.0; printf("%6.2lf%17lld\n",ans,dp[n]); } return 0; }
Description
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