1. 程式人生 > >母函式通用模板

母函式通用模板

本文內容參考下面的文章:

http://blog.csdn.net/xiaofei_it/article/details/17042651

看下面的問題:


解決上述問題的通用程式碼模板如下:

#include<iostream>
using namespace std;

//動態記憶體分配不用memset或memcpy來初始化或複製陣列

int main()
{
	int i,j,m;//迴圈變數

	int k;//有k種硬幣,則有k個()相乘

	int *v = new int[k+1];//v[0]不用,v[i]為第i種硬幣的價值

	//s和e的含義:第i種硬幣至少用s[i]個,至多用e[i]個
	int *s = new int[k+1];//s[0]不用
	int *e = new int[k+1];//e[0]不用

	/*
	*	k,v,s,e的具體值需要自行輸入或設定
	*/

	//計算最高次數MAX = 最高次數
	int MAX = 0;
	for(i=1;i<=k;i++)	
		MAX += v[i]*e[i];

	int *a = new int[MAX+1];//a和b用於記錄執行結果
	int *b = new int[MAX+1];
	for(i=0;i<=MAX;i++)	
	{
		a[i] = 0;
		b[i] = 0;
	}
	a[0] = 1;
	
	//下面是相乘的過程,程式碼很難理解!!!
	for(i=1;i<=k;i++)
	{
		//for(m=0;m<=MAX;m++)		b[m]=0;
		for(j=s[i];j<=e[i] && j*v[i]<=MAX;j++)
			for(m=0;m+j*v[i]<=MAX;m++)
				b[m+j*v[i]] += a[m];
		for(m=0;m<=MAX;m++)
		{
			a[m] = b[m];
			b[m] = 0;
		}
	}

	/*
	*程式執行至此,a[1],a[2],...,a[MAX]是x,x^2,...,x^MAX的係數
	*/

	return 0;
}
由於上述程式碼可以解決多數母函式問題,所以,即使不能理解程式碼,可以先背下來,遇到題目直接套用,也許用著用著,就理解了.

下面,利用上面的模板,求解一個例題


根據生成函式可知,引數如下:

k=3.

v[1]=1,v[2]=3,v[3]=5.

s[1]=0,s[2]=1,s[3]=0.

e[1]=2,e[2]=2,e[3]=3.

代入模板,即可.

程式碼如下:

#include<iostream>
using namespace std;

int main()
{
	int i,j,m;
	int k = 3;
	int v[] = {0,1,3,5};
	int s[] = {0,0,1,0};
	int e[] = {0,2,2,3};
	//上述v[0],s[0],e[0]都不會用到

	int MAX = 0;
	for(i=1;i<=k;i++)
		MAX += v[i]*e[i];
	int *a = new int[MAX+1];
	int *b = new int[MAX+1];

	for(i=0;i<=MAX;i++)
	{
		a[i] = 0;
		b[i] = 0;
	}
	a[0] = 1;

	//開始計算
	for(i=1;i<=k;i++)
	{
		for(j=s[i];j<=e[i] && j*v[i]<=MAX;j++)
			for(m=0;m+j*v[i]<=MAX;m++)
				b[m+j*v[i]] += a[m];

		for(m=0;m<=MAX;m++)
		{
			a[m] = b[m];
			b[m] = 0;
		}
	}

	//輸出的分別是x,x^2,x^3,...,x^MAX的係數
	for(i=1;i<=MAX;i++)
		cout << a[i]<< "  ";
	cout << endl;

	return 0;
}