今天看了下母函數,不太懂。再看,似乎微懂了點。首先,他們的題都是差不多的,求種類、求方案數,幾分硬幣有幾個之類的。
首先要知道,母函數是用來求種類的,它巧妙的運用了多項式展開的法則,本質就是多項式的乘法。
首先,拋出一般的情況,從具有實用性的(1+x)^n開始看,它的展開式,恰巧就是c(n,1)x+c(n,2)x^2+……+c(n,n)x^n,係數便代表了方案數。事情就是這麼簡單。這一串公式的展開式所組成的G(X)就是母函數。
官方定義:(灰常麻煩)(1+x)n是序列C(n,0),C(n,1),...,C(n,n)的母函數。 如若已知序列a0,a1,a2,…則對應的母函數G(x)便可根據定義給出。反之,如若已經求得序列的母函數G(x),則該序列也隨之確定。 序列a0,a1,a2,…可記為{an} 。
舉例說明。舉例的對象一般是砝碼君,小球君,硬幣君等能夠拆成不同品質或等級的,可以用來自由組合的東西。
比如1個1分,1個2分,1個3分,1個4分,可以表示為1+x,1+x^2,1+x^3,1+x^4。他們一乘,即得方案。不同項前的係數即為組成N克的方案數。官方定義叫拆分數。
整數拆分成若干整數的和,辦法不一,不同拆分法的總數叫做拆分數。
下邊按自己理解寫兩個練習,不知道對不對。。。。。不對的請速度評論,我好改。。。
例:若有1克砝碼3枚、2克砝碼4枚、4克砝碼2枚,問能稱出哪幾種重量?各有幾種方案? 答:原始式子得(1+x+x^2+x^3)(1+x^2+x^4+x^6+x^8)(1+x^4+x^8),展開既得結果。。
例:整數n拆分成1,2,3,…,m的和,求其母函數。f(x)=(1/1-x)*(1/1-x^2)*……=1/(1-x)(1-x^2)(1-x^3)…(1-x^m),如果沒錯的話應該是這樣,雖然我數學很差ORZ。
例:如若上例中m至少出現一次,其母函數又如何?這個我看了很久,最終得出答案是上邊那個結果再減1/(1-x)(1-x^2)(1-x^3)…(1-x^m-1)多減了個(1-x^(m-1))的分母吧……
結論感悟不知道,反正能求種類數……= =
編程方法和痛點就是展開多項式了,正在速度觀察中……以上為純數學部分,有理解失誤請一定及時指出。。。
附虛擬碼一個,依然是個人理解感覺自己數學學得真差,MD。。。。:
#include <iostream>using namespace std;int 很大的數組1,很大的數組2;int main(){while (cin>>n){初始化c1為1;for (i=2;i<=n;i++){for (j=0;j<=n;j++)for (k=0;k+j<=n;k+=i)//目前不明這句 { c2[j+k]+=c1[j]; }for (j=0;j<=n;j++){ c1[j]=c2[j];c2[j]=0; }}cout<<c1[n]<<endl;}return 0;}