题目大意:给定一个n,求它有几种构成方式;
例如4 :4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
一共是5种;
思路分析:构造母函数:(1+x+x^2+x^3...+x^n)(1+x^2+x^4+...)(1+x^3+x^6+...)...(1+x^n);
对于第一个式子(1+x+x^2+x^3...+x^n):我们可以理解为分别用了0个1,1个1,2个1,...,n个1能构成的数;
对于第二个式子(1+x^2+x^4+...):我们可以理解为分别用了0个2,1个2,2个2....能构成的数;
那么第一个式子乘第二个式子就代表了用1和2分别能构成那些数,其展开的系数就是用1和2能够成的数的构成方案数;
...
代码实现:
#include<stdio.h>
const int maxn=130;
int c1[maxn],c2[maxn];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<=n;i++){
c1[i]=1;//相当于初始第一个式子的系数;
c2[i]=0;//用来临时存每一次乘一个式子的情况;
}
for(int i=2;i<=n;i++){//从第二个式子开始乘,其实控制的是总体的式子范围,一共n个,减去第一个式子;
for(int j=0;j<=n;j++){//控制每一个式子;
for(int k=0;k+j<=n;k+=i)//控制每个系数的变化和每个数出现的最大项;
c2[j+k]+=c1[j];
}
for(int j=0;j<=n;j++){
c1[j]=c2[j];
c2[j]=0;
}
}
printf("%d\n",c1[n]);
}
return 0;
}