母函式初期簡單入門題練習

2022-05-04 10:15:08 字數 4158 閱讀 3299

母函式,關鍵是理解多項式和問題的聯絡,構造合適的多項式。

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...