经典的硬币问题。和UVa674是一样的。但是不同的是,这个题的输入是double型。这题就麻烦在了这输入这块。我这种方如果输入处理不好。易出现,输入0.30,而tmp = 0,的情况。
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
int tmp;
long long d[81000][12];
int v[12] = { 0, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000 };
long long dp ( int s, int x ) {
if ( d[s][x] >= 0 ) return d[s][x];
d[s][x] = 0;
for ( int i = x; i <= 11; ++i )
if ( s >= v[i] ) d[s][x] += dp ( s - v[i], i );
return d[s][x];
}
int main ( ) {
double money;
//freopen ( "input.txt", "r", stdin );
//freopen ( "output.txt", "w", stdout );
memset ( d, -1, sizeof ( d ) );
for ( int i = 0; i <= 11; d[0][i] = 1, ++i ) ;
while ( scanf ( "%lf", &money ), money > 0 ) {
tmp = ( money + 0.005 ) * 100 ;
//printf ( "%d\n", tmp );
printf ( "%6.2lf%17lld\n", money, dp ( tmp, 1 ) );
}
return 0;
}