什麼是母函數呢。我還是諮詢一下百度百科吧。
定義: 對於任意數列a0,a1,a2...an 即用如下方法與一個函數聯絡起來: ~G(x) = a0 + a1x + a2x^2 + a3x^3 +....+ anx^n 則稱G(x)是數列的 產生函數(generating function) 例子: 比較典型的是:A(x) = (1+x)^n~C(n,0),C(n,1),C(n,2),C(n,3),.....,C(n,n) 我理解的母函數是這個意思:
比如:有兩種類型的紙幣1元和5元分別為兩張和三張。則他們的總共組合有這樣幾種情況。
(1+2x)*(1+3x^5)。
解釋一下(1+2x),x的指數指的是1元價值的紙幣,其x的係數是取其1元(也就是指數)有多少種方式。乘出來的式子也能用這種方式去解釋。
然後就是母函數的求法了。有種背包的思想在裡面,先把第一個式子(也可理解為第一種情況)加入背包中c1[i]。i表示取i有c1[i]種方法,一般初始都是1種。c1[0]也要注意初始化為1.然後從第二個式子開始背包處理,能夠塞入背包的就加上前面情況種數。臨時開一個數組存放資料,也就是c2[k+j]+=c1[j].每加上一個式子便將值更新至c1中,並將c2清零。
#include<iostream>#include<stdio.h>using namespace std;int main(){ int N; int c1[125],c2[125]; while(cin>>N) { int i,j,k; for(i=0;i<=N;i++)//初始化第一個運算式的係數 { c1[i]=1; c2[i]=0; } for(i=2;i<=N;i++) {//從第二個運算式開始,因為有無限制個,所以有n個運算式 for(j=0;j<=N;j++) {//從累乘的運算式後的一個運算式第一個到最後一個 if (c1[j]) //這個是我自己加的 for(k=0;k+j<=N;k+=i) {//k為第j個變數的指數,第i個運算式每次累加i c2[j+k]+=c1[j]; } } for(j=0;j<=N;j++) {//滾動數組算完一個運算式後更新一次 c1[j]=c2[j]; c2[j]=0; } } printf("%d\n",c1[N]); } return 0;}