我的方法:
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
#include<cstring>
#include <algorithm>
#define inf 0x7fffffff
#define N 6005
#define MIN 1e-11
#define M 100
#define LL long long
using namespace std;
int n,k,h,t,m;
long long a[N];
int my[20]={0,1,2,4,10,20,40,100,200,400,1000,2000};
int main()
{
#ifndef ONLINE_JUDGE
freopen("ex.in","r",stdin);
#endif
// scanf("%d%*c%*c",&t);
double temp;
while(scanf("%lf",&temp)&&temp!=0.00)
{
printf("%6.2lf",temp);
memset(a,0,sizeof(a));
// n=temp*100;//不正确!!
n=floor(temp*100+0.5);//精度问题
n/=5;
for(int i=1;i<12;i++)
{
a[my[i]]++;
for(int j=my[i]+1;j<=n;j++)
{
a[j]+=a[j-my[i]];
}
}
printf("%17lld\n",a[n]);
}
return 0;
}
别人的做法:(没看懂啊!!!!)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<fstream>
using namespace std;
long long dollar[12]= {0,1,2,4,10,20,40,100,200,400,1000,2000};
long long m[6005][12];
long long value;
long long dp(long long v,long long k)
{
if(m[v][k]!=-1)return m[v][k];
m[v][k]=0;
for(long long i=k; i<12; i++)
{
if(v>=dollar[i])
{
m[v][k]+=dp(v-dollar[i],i);
}
}
return m[v][k];
}
int main()
{
// freopen("test.txt","r",stdin);
#ifndef ONLINE_JUDGE
freopen("ex.in","r",stdin);
#endif
double a;
memset(m,-1,sizeof(m));
for(long long i=0; i<12; i++)m[0][i]=1;
while(cin>>a)
{
value=(long long)((a*100.0+0.5)/5);
if(!value)break;
long long re=dp(value,1);
printf("%6.2lf%17lld\n",a,re);
}
return 0;
}