背包
#include <cstdio> #include <cstring> int coin[]={5,10,20,50,100,200,500,1000,2000,5000,10000}; long long dp[11][30010]; char s[10]; int solve() { int i=0; int sum=0; for(i=0; s[i]!='.'; i++) sum=sum*10+s[i]-'0'; for(int j=i+1; s[j]!='\0'; j++) sum=sum*10+s[j]-'0'; return sum; } long long dfs(int cur, int sum) { if(sum==0) return dp[cur][sum]=1; if(dp[cur][sum]!=-1) return dp[cur][sum]; dp[cur][sum]=0; for(int i=cur; i<11; i++) { if(sum>=coin[i]) dp[cur][sum]+=dfs(i,sum-coin[i]); } return dp[cur][sum]; } int main() { memset(dp, -1, sizeof(dp)); while(scanf("%s",s)==1 && strcmp(s,"0.00")) { int n=solve(); printf("%6s%17lld\n",s,dfs(0,n)); } return 0; }