uva 147 Dollars (完全背包求方案数+浮点数处理)

别的不讲了,这题和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;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80462393