母函数基本应用

People in Silverland use square coins. Not only they have square shapes but also their values are square numbers. Coins with values of all square numbers up to 289 (=17^2), i.e., 1-credit coins, 4-credit coins, 9-credit coins, ..., and 289-credit coins, are available in Silverland. 
There are four combinations of coins to pay ten credits: 

ten 1-credit coins, 
one 4-credit coin and six 1-credit coins, 
two 4-credit coins and two 1-credit coins, and 
one 9-credit coin and one 1-credit coin. 

Your mission is to count the number of ways to pay a given amount using coins of Silverland. 

InputThe input consists of lines each containing an integer meaning an amount to be paid, followed by a line containing a zero. You may assume that all the amounts are positive and less than 300. 
OutputFor each of the given amount, one line containing a single integer representing the number of combinations of coins should be output. No other characters should appear in the output. 
Sample Input

2
10
30
0

Sample Output

1
4
27

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<stack>
 8 #include<deque>
 9 #include<iostream>
10 using namespace std;
11 typedef long long  LL;
12 int a[310];     //生成函数
13 int b[310];     //辅助数组,帮助完成系数的转移
14 int main()
15 {
16     int n;
17     while(scanf("%d",&n)!=EOF)
18     {
19         if(n==0)
20             break;
21         int i,p,j;
22         for(i=0;i<=300;i++) //对两个数组进行初始化,因为一开始什么也没有,所以系数都为1
23         {
24             a[i]=0;
25             b[i]=0;
26         }
27         for(i=0;i<=300;i++)     //因为1元的硬币有无限个,所以0到300元都可以构成
28             a[i]=1;
29         for(i=2;i<=17;i++)      //一共有17个式子想乘,第一个1元的式子已经处理完了,从2元的开始处理
30         {
31             for(j=0;j<=n;j++)       //遍历之前形成的式子的每一项
32                 for(int k=0;k+j<=n;k+= i*i)     //遍历要乘的式子中系数不为零的项
33                     b[k+j]+=a[j];
34             for(int j=0;j<=n;j++)       //将第i个式子处理完之后的系数赋值给初始函数式,同时b数组准备下一轮的转换
35             {
36                 a[j]=b[j];
37                 b[j]=0;
38             }
39         }
40         printf("%d\n",a[n]);    //有几种组成n元的方式
41     }
42     return 0;
43 }

 

posted @ 2018-08-07 08:27  Daybreaking  阅读(246)  评论(0编辑  收藏  举报