找零钱(母函数)

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 }




原文地址:https://www.cnblogs.com/wkfvawl/p/9745156.html