题目大意:
有是一种不同面值的钱币,求利用这些钱币有几种方法可以给出指定的价钱。
思路:
动态规划 有类似题 要扩大100倍就可以避免小数计算
数组开太小WA了一次。注意要用long long
代码:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
long long dp[30010][15];
int coins[11] = {5,10,20,50,100,200,500,1000,2000,5000,10000};
long long solve(int i,int sum) {
if(dp[sum][i] != -1)
return dp[sum][i];
dp[sum][i] = 0;
for(int j = i; j < 11 && sum >= coins[j];j++)
dp[sum][i] += solve(j,sum - coins[j]);
return dp[sum][i];
}
int main() {
double n;
memset(dp,-1,sizeof(dp));
while(scanf("%lf",&n) != EOF) {
if(n == 0.00)
break;
int t = (int )(n * 100 + 0.5);//注意精度
for(int i = 0 ; i < 11; i++)
dp[0][i] = 1;
printf("%6.2f%17lld\n",n,solve(0,t));
}
return 0;
}