1. 程式人生 > >找零錢(母函數)

找零錢(母函數)

沒有 script rip space ace leo ret std color

Description

我們知道人民幣有1、2、5、10、20、50、100這幾種面值。 現在給你 n(1≤n≤250)元,讓你計算換成用上面這些面額表示且總數不超過100張,共有幾種。 比如4元,能用4張1元、2張1元和1張2元、2張 2元,三種表示方法。

Input

輸入有多組,每組一行,為一個整合n。 輸入以0結束。

Output

輸出該面額有幾種表示方法。

Sample Input

1
4
0

Sample Output

1
3

解題思路:這一道題如果不是必須使用母函數的話可以有很多種解法,比如記憶化搜索,動態規劃等等,這道題和一般的母函數模板不同的地方在於限制了鈔票
的數量,而母函數卻沒有考慮過這個問題,所以就需要給b數組增加一個維度來限制鈔票張數不超過100。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define ll long long int
 6 #define MAX 17
 7 #define N 255
 8 using namespace std;
 9 int a[N][N];
10 int b[N][N];
11 int ans[N];
12 int v[]= {1,2,5,10,20,50,100}; 13 void init()///打表 14 { 15 int i,j,k,l; 16 a[0][0]=1; 17 for (i=0; i<7; i++)///面值 18 { 19 for (j=0; j*v[i]<N; j++)///步長 20 { 21 for (k=0; k+j*v[i]<N; k++)///從x^0到x^N遍歷一遍 22 { 23 for(l=0; l+j<=100; l++)///
鈔票數量 24 { 25 b[j*v[i]+k][l+j]+=a[k][l]; 26 } 27 } 28 } 29 for (j=0; j<N; j++) 30 { 31 for(k=0; k<N; k++) 32 { 33 a[j][k]=b[j][k]; 34 b[j][k]=0; 35 } 36 } 37 } 38 for(i=0;i<N;i++)///轉換 39 { 40 for(j=0;j<=100;j++) 41 { 42 ans[i]+=a[i][j]; 43 } 44 } 45 } 46 int main() 47 { 48 int n; 49 init(); 50 while(scanf("%d",&n)!=EOF) 51 { 52 if(n==0) 53 { 54 break; 55 } 56 printf("%d\n",ans[n]); 57 } 58 return 0; 59 }



找零錢(母函數)