别的不讲了,这题和uva 674神似,不会的戳这里,是uva674的加强版,多了浮点数的处理。
下面主要讲讲如何对浮点数进行处理。
1.分开计算整数部分和小数部分,最后相加
int a, b;
while(~scanf("%d.%d", &a, &b), a + b) {
ll x = a * 100 + b;
printf("%6.2f%17lld\n", x * 1.0 / 100, dp[x]);
}
2.可以在*100的时候加上一个eps
double n;
while(~scanf("%lf", &n)) {
if(n - 0.00 < eps) break;
ll x = (n * 100 +0.5);//0.5就是所谓的eps,这题加上一个小于1.0的值一般都可以过
printf("%6.2f%17lld\n", x * 1.0 / 100, dp[x]);
}
完整代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define eps 1e-6
using namespace std;
typedef long long ll;
ll dp[30005];//dp[i]表示面额为i时的交换方法数
int coin[] = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};
int main() {
dp[0] = 1;
for(int i = 0; i < 11; i++) {
for(int j = coin[i]; j <= 30000; j++) {
dp[j] = dp[j] + dp[j - coin[i]];
}
}
// int a, b;
// while(~scanf("%d.%d", &a, &b), a + b) {
// ll x = a * 100 + b;
// printf("%6.2f%17lld\n", x * 1.0 / 100, dp[x]);
// }
double n;
while(~scanf("%lf", &n)) {
if(n - 0.00 < eps) break;
ll x = (n * 100 +0.5);
printf("%6.2f%17lld\n", x * 1.0 / 100, dp[x]);
}
return 0;
}