题目大意:
给定11种面值分别为$100, $50, $20, $10, $5, $2, $1, 50c, 20c, 10c , 5c 的钱,现在给定一个钱数,求出可以组成的种类数。
解析:
类似于uva 674,不过此题的精度太强了。
int n=(int)(nn*100+0.5); 注意用long long ,种类数可能非常大
用dp[v]表示:当前价格用的方法个数
给定11种面值分别为$100, $50, $20, $10, $5, $2, $1, 50c, 20c, 10c , 5c 的钱,现在给定一个钱数,求出可以组成的种类数。
解析:
类似于uva 674,不过此题的精度太强了。
int n=(int)(nn*100+0.5); 注意用long long ,种类数可能非常大
用dp[v]表示:当前价格用的方法个数
状态转移方程:dp[v + coin[i]] += dp[v];
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 50000;
const int coin[11] = {5,10,20,50,100,200,500,1000,2000,5000,10000};
ll dp[N];
int main() {
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(int i= 0; i < 11; i++) {
for(int v = 0; v < N - 15000; v++) {
dp[v+coin[i]] += dp[v];
}
}
double val;
while(scanf("%lf",&val) != EOF) {
ll v = (val * 100 + 0.5);
if(v == 0) {
break;
}
printf("%6.2lf%17lld\n",val,dp[v]);
}
return 0;
}