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 ",ans[n]); 57 } 58 return 0; 59 }