母函式,關鍵是理解多項式和問題的聯絡,構造合適的多項式。
1. hdu1557: 題意:給n個數,如果其中有m個數之和大於這n個數一半,則這m個數組成這個團體叫「獲勝聯盟」,這m個數中,若有乙個數,去掉它,這個團體就不能成為獲勝聯盟了,那麼這個數為關鍵加入者。每成為一次關鍵加入者,則這個數的權利加1,求所有數的權利(輸出)。
思路:求出所有的數組合之和(任意幾個數之和)(和小於所有和二分之一即可),然後 列舉n個數,每次加乙個數(原來之和小於一半,非獲勝聯盟),看加入後是否成為獲勝聯盟,若是,該數權利+該組合方案數。
母函式模型: (1+x^v[0])*(1+x^v[1])*******(1+x^v[n-1]) (v[i]表示第i個數),(每個數有兩種選擇,取取或不取,最終指數表示和,其係數表示該和有多少種組合方案)
#include#include#include#includeint b[10000];
int a[10000];
int quanlizhishu[10000];
using namespace std;
int main()
}for(i=0;i2.hdu1028 任意給你乙個整數,問有多少種拆分方案。
母函式典例。(1+x^1+x^2+...)*(1+x^2+x^4....)*(1+x^3+x^6+....)。。。第乙個括號取1,指數表示個數,0表示不取,其後依次。
#include#includeusing namespace std;
int a[200];
int b[200];
int main()
}for(j=0;j<=n;j++)
}cout<
3.hdu1398 平方數和的組合數。基數是平方數即可。無限型別,自己看上限多少。適可而止。
多項式:(1+x^1+x^2+...)*(1+x^4+x^8....)*(1+x^9+x^18+....)...指數表基數,係數是方案數
#include#includeusing namespace std;
int a[301];
int b[301];
int v[18];
int main()
while(cin>>n&&n)
}for(j=0;j<=n;j++)
}cout<
hoj1085,有限個基數情況,基數為1,2,5,每個個數為題目輸入。
多項式:(1+x^1+x^2+..)*(1+x^2+x^4+...)*(1+x^5+x^10+..)每個的項數為所給的個數+1(可不取)。響應處理技巧見**。
#include#includeusing namespace std;
int a[9001];
int b[9001];
int main()
; //基數陣列
int d[4]=; //用乙個陣列來對應第i個括號項數。
for(i=1;i<4;i++)
if(i==1)break;
}for(j=0;j<=maxzhishu;j++)
//輸出第乙個無法實現的組合
a[j]=0;
}if(mark==0)break;
}if(min==-1)cout<
hdu 1171,每個物品有價值和數量。都由輸入給出。把所有物品分給2個人(單件物品不可拆分),要求盡量公平(價值差距盡量小).
母函式可以求出價值和的所有可能情況,然後總價值除以2,從這開始找存在的方案。第乙個找到的(離中點最近),是最公平的。
母函式:不貼了。
#include#include#includeusing namespace std;
int a[500001];
int b[500001];
struct vv
;int main()
int maxzhishu=0;
for(i=1;i<=n;i++)
if(i==1)break;//第乙個括號只要乘一次.
}for(j=0;j<=maxzhishu;j++)
} //此時max指數是所有價值之和。
for(i=maxzhishu/2;i>=0;i--) //找到一半之後開始早到第乙個有組合數的(存在的方案)
if(b[i]) //現在看來這個marks好像沒用...
cout<
hdu 2079 有限數量組合。
#include#include#includeusing namespace std;
int a[10001];
int b[10001];
struct vv //有限項組合,每項指數與數量用結構體擊殺!
;int main()
int maxzhishu=0;
for(i=1;i<=n;i++)
if(i==1)break;//第乙個括號只要乘一次.
}for(j=0;j<=maxzhishu;j++)
}cout<
hdu2082,有限,每個有價值,典例。
#include#include#includeusing namespace std;
int a[101];
int b[101];
struct vv //有限項組合,每項指數與數量用結構體擊殺!
;int main()
int maxzhishu=0;
for(i=1;i<=26;i++)
if(i==1)break;//第乙個括號只要乘一次.
}for(j=0;j<=maxzhishu;j++)
}int sum=0;
for(i=1;i<=50;i++)
if(b[i])sum+=b[i];
cout<
hdu 2110,數量有限,價值,
#include#include#includeusing namespace std;
__int64 a[1001];
__int64 b[1001];
struct vv //有限項組合,每項指數與數量用結構體擊殺!
;int main()
if(mubiao%3!=0)
if(i==1)break;//第乙個括號只要乘一次.
}for(j=0;j<=maxzhishu;j++)
}if(b[mubiao])
cout<
類似:普通型母函式hdu 2152,2189。無非是基數變化,數量變化。
不貼了。
hdu1709 用乙個天平稱東西,每一定種類的砝碼各乙個,問哪些重量稱不出來,(砝碼倆邊可放),這題是有負指數母函式,下表不能負,所以每個加100(最大負),總的加100*n+sum。
母函式:(x^-p[0]+1+x^p[0])*(......).....此時,負表放在物品那一邊,正數是放在砝碼一邊,或者不放。
#include#include#includeusing namespace std;
int a[30005];int b[30005];
int main()
b[0]=1;
for(i=1;i<=n;i++)
if(i==1)break;
}for(j=0;j<=n*100+sum;j++)
}int count=0;int kk[10005];
memset(kk,0,sizeof(kk));
for(i=n*100;i<=n*100+sum;i++)
}printf("%d\n",count);
for(i=0;i
hdu 1521 n種物品,每種xi個,取r個的排列數,顯然這個是排列問題,用指數型母函式(需要先學習指數型母函式)。
該題: (1+x+x^2/2!+x^3/3!+...x^xi/xi!)*(1+...)
#include#include#include#includeusing namespace std;
double a[50]; //指數型的,係數用double型,
double b[50];
double fa[50];
void f() //階乘
int main()
if(i==1)break;
}for(j=0;j<=r;j++)
}cout<
母函式入門
題目 hdu1028 題意 整數拆分 乙個整數能有幾種拆分方式 解答 其中一種方法是用母函式。對於這道題來說是 1 x x 2 x 3 x 4.1 x 2 x 4 x 6 x 8 x 10 1 x 3 x 6 x 9 一直到n 最後算出來了結果之後係數表示拆分的方法數,指數表示拆幾 先給 inclu...
母函式入門
母函式也叫生成函式,是組合數學中尤其是計數方面的乙個重要理論和工具。母函式有普通型母函式和指數型母函式兩種,其中普通型用的比較多。形式上說,普通型母函式用於解決多重集的組合問題,而指數型母函式用於解決多重集的排列問題。母函式還可以解決遞迴數列的通項問題 例如使用母函式解決斐波那契數列的通項公式 定義...
母函式練習2
題目 hdu1171 題意 有n個物品,每個物品有它的重量和它的數目。求怎麼盡可能把它們分成兩部分。解答 寫出其母函式,然後模擬 也可以用完全揹包 include include include include includeusing namespace std const int maxn 25...