UVa 147 - Dollars
题目大意:有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\n", money, dp[n]); 25 } 26 return 0; 27 }