母函式與排列組合
在談論母函式問題之前,我們先看乙個簡單的問題描述:假如有兩組資料(a,b)和(c,d),每組中選出乙個構成乙個組合,總共有幾種選法?很顯然總共有4種選法:ac,ad,bc,bd。而且很容易聯想到這個式子(a+b)*(c+d)=a*c+a*d+b*c+b*d。式子中的幾個乘積項就是上面的4種選法。假如把問題換一下:每組中選出乙個或0個資料構成組合,總共有幾種組合?那麼結果就變成:,a,b,c,d,ac,ad,bc,bd,而式子(1+a+b)*(1+c+d)=1+c+d+a+a*c+a*d+b+b*c+b*d,正好和上面組合的結果又一致(1代表什麼都沒選)。從這2個例子我們可以發現多項式乘積和組合存在著某種關係。事實上我們可以這麼理解:(1+a+b)可以理解為從第一組資料中取0個資料,取a或者取b,同樣(1+c+d)可以理解為從第二組資料取0個資料,取c或者取d。兩者相乘的結果就表示了所有的組合。再看一下這個多項式:
(1+x)*(1+x+x2)*(1+x3)=1+2x+2x2+2x3+2x4+2x5+x6
這個多項式和上面的有一些區別了,它的冪級數超過1了。如果要從(1+x)、(1+x+x2)和(1+x3)中得到x的2次方的話,有兩種選擇:從(1+x)和(1+x+x2)中分別選擇乙個x或者從(1+x+x2)中選擇x2;如果要得到x的6次方的話,只有1種選擇,就是從(1+x)中選擇x、(1+x+x2)中選擇x2、(1+x3)中選擇x3。也就是說乘積結果的每一項anxn的前面的係數an表示了從(1+x)、(1+x+x2)和(1+x3)中得到xn的組合數。
其實上面的例子就利用了母函式的思想,下面來具體討論一下母函式。
一.什麼是母函式
下面這個對於母函式的描述摘自維基百科:
在數學中,某個序列 的母函式是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。
也就是說母函式是針對某個序列的,它的外在表現形式是一種形式冪級數。比如說有這樣乙個序列a0,a1,......an,構造乙個函式
f(x)=a0+a1x+a2x2+......+anxn
則f(x)是序列a0,a1,......an的母函式。比如說最常見的(1+x)n,它是序列c(n,0),c(n,1),c(n,2)...c(n,n)的母函式。
母函式包括幾種,其中最常見的是普通型母函式和指數型母函式。普通型母函式是形如 f(x)=a0+a1x+a2x2+......+anxn的函式,而指數型母函式是形如g(x) = a0 + a1*(x)/1! + a2*(x2)/ 2! + a3*(x3)/3! + …… an*(xn)/k!的函式。
二.利用普通型母函式解決組合問題
利用母函式的思想可以解決很多組合問題,下面舉例說明:
1.口袋中有白球2個,紅球3個,黃球1個,從袋中摸出3個球有幾種取法?
和上面描述的例子類似,我們可以用次數代表球的個數,多項式的每一項前面的係數代表取法的種樹。
可以很容易地寫出下面這個式子:
(1+x+x2)(1+x+x2+x3)(1+x)
(1+x+x2)表示有白球2個,1表示白球不取,x代表取1個白球,x2代表取2個白球,即用x的次數表示取球的個數,後面的也是類似。那麼這個多項式的乘積就把所有的情況都表示出來了,對於最終乘積的每一項anxn,表示取n個球有an種取法。
2.有若干個1克,2克,5克的砝碼,要稱出20克的重量,有多少種稱法?
這裡不限制砝碼的個數,無所謂,照樣寫出母函式:
(1+x+x2+x3+......xk+....)(1+x2+x4+x6......+x2n+......)(1+x5+x10+......x5m+......)
因為要稱出20克,所以只需要找找到結果中次數為20 的那一項就可以得到結果。
3.同樣對於正數劃分也可以解決,比如有整數20,劃分成1,2,5,有多少種劃分方法?
解法和2的類似。
還有一類題目和這類似,有n個球放到m個盒子中,有多少種不同的放法?
(1+x+x2+x3+...xk+...)(1+x+x2+x3+...xk+...)(1+x+x2+x3+...xk+...)總共有m項,然後找出乘積中次數為n的那一項係數。
三.利用指數型母函式解決排列問題
1.口袋中有白球2個,紅球3個,黃球1個,任取3個作為乙個排列,總共有多少種排列?
類似地用指數型母函式解決
用(1+x/1!+x2/2!)表示取白球0個,1個或者2個
那麼(1+x/1!+x2/2!)(1+x/1!+x2/2!+x3/3!)(1+x/1!)來表示所有的排列結果。
=1+3x+4x2+19x3/6+19x4/12+6x5/12+x6/12
=1+3*(x/1!)+8*(x2/2!)+19*(x3/3!)+38*(x4/4!)+60*(x5/5!)+60*(x6/6!)
找到次數為3的那一項,係數為19,那麼總共有19種排列。
2.用1,2,3,4能夠組成多少個5位數,要求1出現2次或者3次,2出現0次或者1次,3沒有限制,4只出現偶數次。
(x2/2!+x3/3!)(1+x)(1+x/1!+x2/2!+x3/3!+.....xk/k!+....)(1+x2/2!+x4/4!+......+x2n/(2n)!+......)
每個式子的含義就不多解釋了,讀者應該能看懂它的含義。最終的結果就是x5/5!這一項的係數。
用**去實現母函式的計算過程很簡單,它是模擬我們人工計算多項式乘積的過程,比如有多項式h1*h2*h3......
我們先計算h1和h2的乘積,得到結果h',再用h'和h3相乘......依次類推下去,直到得到最終的結果。
//下面這道題目是航電上的一道題:
//題目意思是有1分,2分,5分的硬幣各a,b,//c枚,求算不能組成的總錢數的最小值。
#include using namespace std;
int main(int argc, char *argv)
; //次數增長步長
while(scanf("%d %d %d",&num[0],&num[1],&num[2]) != eof)
//母函式為(1+x+x^2+...x^num[0])(1+x^2+x^4+....x^2*num[1])(1+x^5+x^10+...+x^5*num[2])
for(i=0;i<=cent[0]*num[0];i+=cent[0]) //第乙個多項式的係數初始化
for(i=1;i<3;i++) //i表示總共有多少個多項式
}for(j=0;j<=max;j++) //將臨時陣列清零
}for(i=0;i<=max;i++)
printf("%d\n",i);
}return 0;
}
C語言庫函式 侵刪
1.strlen 標頭檔案 include strlen 函式用來計算字串的長度,其原型為 unsigned int strlen char s s為指定的字串 include includeint main 執行結果 strlen str1 38,sizeof str1 4 strlen str1...
母函式 詳解
tanky woo 母函式 generating function 詳解 前段時間寫了一篇 揹包之01揹包 完全揹包 多重揹包詳解 看到支援的人很多,我不是大牛,只是乙個和大家一樣學習的人,寫這些文章的目的只是為了一是希望讓大家學的輕鬆,二是讓自己複習起來更方便。ps 大家覺得我的文章還過的去就幫我...
母函式詳解
母函式詳解 在數學中,某個序列的母函式 generating function,又稱生成函式 是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。使用母函式解決問題的方法稱為母函式方法。母函式可分為很多種,包括普通母函式 指數母函式 l級數 貝爾級數和狄利克雷級數。對每個序列都可以寫出以上每...