题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028
题目大意:3=1+1+1=1+2=3 ;4=4=1+1+1+1=1+2+1=1+3;所以3有3种加法,4有4种加法,给出一个n,(1<=n<=120) ,计算n有几种加法。
解法:母函数的最简单的一道入门题之一。
说明:今早上突发奇想着想学学母函数,就搜了搜HDU ACM PPT 的母函数一版,把这道题分享给大家。
感想:这道题之前看过,推过公式什么的,没推出来。今天才知道是母函数的算法。算法果然奇妙啊,我得加紧学习算法了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #define inf 0x7fffffff 8 using namespace std; 9 int main() 10 { 11 int an[222],bn[222]; 12 int n; 13 while (cin>>n) 14 { 15 for (int i=0 ;i<=n ;i++) {an[i]=1 ;bn[i]=0 ; } 16 //模拟多项式乘法 17 for (int i=2 ;i<=n ;i++) // 从第二个多项式开始枚举 18 { 19 for (int j=0 ;j<=n ;j++)//枚举第一个多项式的系数 20 { 21 for (int k=0 ;k+j<=n ;k+=i) //枚举第i个多项式各项系数 22 { 23 bn[j+k] += an[j]; 24 } 25 } 26 for (int j=0 ;j<=n ;j++) 27 { 28 an[j]=bn[j]; 29 bn[j]=0; 30 } 31 } 32 printf("%d ",an[n]); 33 } 34 return 0; 35 }