參考:
母函式與排列組合:
// n1為最少數量陣列,n2為最大數量陣列,v為權值,p為最大值
//為計算結果,b為中間結果。
int a[max],b[max];
//初始化a
memset(a,0,sizeof(a));
a[0]=1;
for (int i=1;i<=17;i++)//迴圈每個因子
//初始化a,因為有last,所以這裡無需初始化其他位
a[0]=1;
intlast=0;
for (int i=0;iint last2=min(last+n[i]*v[i],p);//計算下一次的last
memset(b,0,sizeof(int)*(last2+1));//只清空b[0..last2]
for (int j=n1[i];j<=n2[i]&&j*v[i]<=last2;j++)//這裡是last2
for (int k=0;k<=last&&k+j*v[i]<=last2;k++)//這裡乙個是last,乙個是last2
b[k+j*v[i]]+=a[k];
memcpy(a,b,sizeof(int)*(last2+1));//b賦值給a,只賦值0..last2
last=last2;//更新last
}
生成函式題集
一、hdu 1085和hdu 1171兩題套用了第二個模板,省略了**中二三層迴圈裡關於last2的條件(其實也可以加上)。
詳見:hdu 1085:
hdu 1171:
二、hdu 1398套用了第乙個模板,因為n2中每一項為無窮大,所以n2陣列就省略了。
詳見:hdu 1398:
三、hdu 2079、hdu 2082和hdu 2110三題直接套用了第二個模板。
詳見:hdu 2079:
hdu 2082:
hdu 2110:
另外,至於什麼時候用第乙個模板,什麼時候用第二個模板,就看題目規模。
通常情況下,第乙個模板就夠用了,上面的那些用第二個模板的題目用第乙個模板同樣能ac。
但如果資料規模比較大(通常不會有這種情況),就要使用第二個模板了。
以上題目n1均為0。
四、hdu 2152是一道n1不為0的題目,我在這裡分別套用第乙個和第二個模板解題。
詳見:hdu 2152:
組合數學 母函式
在數學中,某個序列的母函式 generating function,又稱生成函式 是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。使用母函式解決問題的方法稱為母函式方法。母函式可分為很多種,包括普通母函式 指數母函式 l級數 貝爾級數和狄利克雷級數。對每個序列都可以寫出以上每個型別的乙個...
組合數學 1 母函式與整數拆分
是組合數學的核心。筆者認為,母函式作為函式並不和我們以前所學習的函式一樣,著重於自變數的值以及因變數的值,包括其變化趨勢 奇偶性等等性質。而是作為乙個載體,乙個媒介,將數字與現實生活中的具體方案給串聯起來。母函式的定義 對於任意數zd列a0,a1,a2 an 即用如下方法與版乙個函式聯絡起來 g x...
母函式與排列組合
母函式與排列組合 在談論母函式問題之前,我們先看乙個簡單的問題描述 假如有兩組資料 a,b 和 c,d 每組中選出乙個構成乙個組合,總共有幾種選法?很顯然總共有4種選法 ac,ad,bc,bd。而且很容易聯想到這個式子 a b c d a c a d b c b d。式子中的幾個乘積項就是上面的4種...