UVa 147

  题目大意:有11种类型的硬币,给一定的数额,计算有多少中不同的硬币兑换方案。

  硬币兑换问题,要注意的就是浮点数转化成整数的误差问题。对硬币金额除以5可以减小计算,计算结果要用long long 类型保存。

 1 #include <cstdio>
 2 #include <cstring>
 3 #define MAXN 6000+10
 4 
 5 const int coin[11] = {1, 2, 4, 10, 20, 40, 100, 200, 400, 1000, 2000};
 6 long long dp[MAXN];
 7 
 8 int main()
 9 {
10 #ifdef LOCAL
11     freopen("in", "r", stdin);
12 #endif
13     memset(dp, 0, sizeof(dp));
14     dp[0] = 1;
15     for (int k = 0; k < 11; k++)
16         for (int i = 1; i < MAXN; i++) 
17             if (i >= coin[k])
18                 dp[i] += dp[i-coin[k]];
19     double money;
20     int n;
21     while (scanf("%lf", &money) != EOF && money)
22     {
23         n = (int)(money*100 + 0.5) / 5;
24         printf("%6.2lf%17lld
", money, dp[n]);
25     }
26     return 0;
27 }
View Code
原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3284968.html