母函式與排列組合

2021-06-19 04:02:50 字數 3240 閱讀 3779

母函式與排列組合

在談論母函式問題之前,我們先看乙個簡單的問題描述:假如有兩組資料(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;

}

母函式與排列組合

在談論母函式問題之前,我們先看乙個簡單的問題描述 假如有兩組資料 a,b 和 c,d 每組中選出乙個構成乙個組合,總共有幾種選法?很顯然總共有4種選法 ac,ad,bc,bd。而且很容易聯想到這個式子 a b c d a c a d b c b d。式子中的幾個乘積項就是上面的4種選法。假如把問題換...

排列組合問題 母函式

母函式方法是用模擬多項式的辦法來解決排列組合問題。例如多項式 1 x x 2 1 x 3 1 x 4 x 8 x 12 可用來表示2個1 kg 1個3 kg 3個4 kg 的貨物的排列組合。x y前的係數即為組成y kg 的方案數。可以看到每個括號中的式子x的指數都是成比例增長,意為選擇的此重量的個...

排列組合 母函式 筆記

圓排列個數 p n,r r n r n r 例 8 人圍著餐桌吃飯,多少種就座方式?ans p 8,8 8 7 a.無限重排列 n個不同元素中取 r個按次序排列,每個元素可取無限次,總數為nr。b.有限重排列 r 個不同色彩球放入 n個標號的盒子,第 i種彩球有 ri個,總數為 p n,r r1 r...