母函数法解整数划分
上课的时候听得挺MB
然后自己看了半天dalao们的思路才理解
(此次%%%一波大佬们orz)
关键
两个数相乘指数相加
G(x)=(1+x+x^2+x^3+x^4+……)(1+x^2+x^4+x^6)(1+x^3+x^6+x^9+……)(1+x^4+x^8+x^12+……)……
第一个式子代表的是1取一个,两个,三个,这里的几个代表式子中的指数
而可以把N分成N个1,所以第一个式子是N个,以此类推,第二个式子可以取N/2个
方案数就会等于x的指数等于N时有几个
*例:N=7时,可以从第一个式子中x^7得到(取7个1),同时可以通过第一个式子中的x^5加上第二个式子中的x^2得到(取5个1和1个2)*
思路
把第一个式子全部赋值为一种
c1存变量,c2存每两个式子相乘的方案数
最终答案在c1[n]中
代码如下
#include<iostream>
using namespace std;
int c1[200],c2[200];
int n;
int main()
{
cin>>n;
for(int i=0;i<=n;i++)
c1[i]=1;
for(int i=2;i<=n;i++)//从第二个式子算起
{
for(int j=0;j<=n;j++)//第i个式子中有n个数
{
for(int k=0;k+j<=n;k+=i)//k+=i是因为第j个式子的增量是i
//k+j<=n是因为只需要算到n,后面的可以不用算
{
c2[k+j]+=c1[j];//方案数累加
}
}
for(int i=0;i<=n;i++)
{
c1[i]=c2[i];//交换变量计算下一个式子
c2[i]=0;
}
}
cout<<c1[n];//华丽丽地输出总方案数
}
总结
母函数法虽然在效率方面取胜
但是在想法上面还是挺难想到的
一般人都想不到好吗
所以还是推荐DFS法
再次%%%一波dalao们orz