我的方法:
#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 longusing 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;}