母函式通用模板
阿新 • • 發佈:2019-02-03
本文內容參考下面的文章:
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; }