母函数

来源:互联网 发布:管家婆软件教学视频 编辑:程序博客网 时间:2024/06/10 23:15
很早就知道母函数,但是没有真正做过题,今天接触了母函数,有了一点了解,做的这两道题都可以用背包来解决。不知道母函数解决问题和背包有什么关系。//HDOJ_1398  Square Coins//G(x)=(1+x+x^2+x^3+x^4+…)(1+x^4+x^8+x^12+…)(1+x^9+x^18+x^27+…)…#include <iostream>using namespace std;const int lmax=300;int c1[lmax+1],c2[lmax+1];int main(void){int n,i,j,k;while (cin>>n &&n){for (i=0;i<=n;i++){                c1[i]=1;                c2[i]=0;                 }// 对c1初始化,由第一个表达式(1+x+x2+..x^17)初始化,把质量从0到17的所有硬币个数都初始for (i=2;i<=17;i++) // i从2到n遍历,一次模拟手工打开括号,从第二个到低17个括号{for (j=0;j<=n;j++)//3j 从0到n遍历,这里j就是里第j个变量的系数for (k=0;k+j<=n;k+=i*i)//4k表示的是第j个指数,所以k每次增i*i{c2[j+k]+=c1[j];}for (j=0;j<=n;j++)//5为打开下一个括号准备{c1[j]=c2[j];c2[j]=0;}}cout<<c1[n]<<endl;}return 0;}//HDOJ1085  //G(x)=(1+x+x^2+...+x^a)*(1+x^2+x^4...+x^2b)*(1+x^5+x^10+...+x^5c)  #include<stdio.h>#define N  150int a[N+1],b[N+1];void solve(){int i,j,k;for(i=0;i<=N;i++){a[i]=1;b[i]=0;}for(i=2;i<=N;i++){for(j=0;j<=N;j++)for(k=0;k+j<=N;k+=i){b[j+k]+=a[j];}for(j=0;j<=N;j++){a[j]=b[j];b[j]=0;}}    /*for(i=0;i<=20;i++)printf("%d ",a[i]);*/return ;}int main(){int n;solve();while(scanf("%d",&n)!=EOF){printf("%d\n",a[n]);}return 0;}

原创粉丝点击