1. 程式人生 > >母函式初步

母函式初步

定義

對於序列a0,a1,a2,…,an構造一函式 G(x) = a0+a1*x+a2*x2+a3*x3+…+an*xn
則稱G(x)是序列a0,a1,a2,…,an的母函式。
在下面的例題中可以看到母函式可以將問題的複雜度從窮舉(NN)降為N3

應用

例1:若有1克、2克、3克、4克的砝碼各一 枚,能稱出哪幾種重量?各有幾種可能方案?
考慮構造母函式。

如果用x的指數表示稱出的重量,則:
1個1克的砝碼可以用函式1+x表示,
1個2克的砝碼可以用函式1+x2表示,
1個3克的砝碼可以用函式1+x3表示,
1個4克的砝碼可以用函式1+x4表示,
G(x)=(1+x)(1+x2

)(1+x3)(1+x4)
=(1+x+x2+x3)(1+x3+x4+x7)
=1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10
從上面的函式知道:可稱出從1克到10克,係數便是方案數。
例如右端有2x5 項,即稱出5克的方案有2:5=3+2=4+1;同樣,6=1+2+3=4+2;10=1+2+3+4。
故稱出6克的方案有2,稱出10克的方案有1
例2:求用1分、2分、3分的郵票貼出不同數值的方案數
此時郵票的數量是無限大了,所以母函式其實是無法構造完全的
G(x)=(1+x+x2+x3+x4+…)(1+x2+x4+x6+…)

程式碼實現例2

實際問題中會給出要求解n,即貼出n分錢的方案有幾種。這時每個項的最高次冪不必超過n,超出也沒有意義,限制再嚴一點,結果也不必有超過n的次冪。

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

const int lmax=10000;    
int factor[lmax+1],tmp[lmax+1];//factor[]放最終結果,tmp[]放臨時變數

int main()
{	int n,i,j,k;
	while (cin>>n)
	{
		for (i=0;i<=n;i++)
		{
			factor[i]=1;//初始化每個項的係數都是1 (1+x+x^2+x^3+x^4+...+x^n)
tmp[i]=0; } for (i=2;i<=3;i++)//模擬多項式計算,先後乘以第二三項 { for (j=0;j<=n;j++)//這是上一層係數的遍歷 for (k=0;k+j<=n;k+=i)//這是該項裡面x冪數的遍歷(1+x^2+x^4+....) { tmp[k+j]+=factor[j]; //把上一層乘法結果的係數加起來 } for (j=0;j<=n;j++)//把值賦給factor[],tmp清零 { factor[j]=tmp[j]; tmp[j]=0; } } cout<<factor[n]<<endl; } return 0; }