题意:有一些面额种类不同的钞票(无限多个),然后给出一个金额,要求输出由这些面额不同的钞票组成这个金额的种类一共是多少。
题解:dp自顶向下递归查询,为了计算方便,将金额扩大100倍,然后美元同样扩大100倍,而在调用时初始金额要强制转换为整形,为了精确要加10^-8。
#include <stdio.h>
#include <string.h>
const int N = 30005;
long long f[N][11];
const int coin[11] = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};
double m;
long long dp(int s, int i) {
if (f[s][i] != -1)
return f[s][i];
f[s][i] = 0;
for (int j = i; j < 11 && s >= coin[j]; j++)
f[s][i] += dp(s - coin[j], j);
return f[s][i];
}
int main() {
memset(f, -1, sizeof(f));
for (int i = 0; i < 11; i++)
f[0][i] = 1;
while (scanf("%lf", &m) && m) {
int mm = m * 100 + 1e-8;
printf("%6.2lf%17lld\n", m, dp(mm, 0));
}
return 0;
}