模板母函數(產生函數)

來源:互聯網
上載者:User

什麼是母函數呢。我還是諮詢一下百度百科吧。

定義: 對於任意數列a0,a1,a2...an 即用如下方法與一個函數聯絡起來: ~G(x) = a0 + a1x + a2x^2 + a3x^3 +....+ anx^n 則稱G(x)是數列的 產生函數(generating function) 例子: 比較典型的是:A(x) = (1+x)^n~C(n,0),C(n,1),C(n,2),C(n,3),.....,C(n,n) 我理解的母函數是這個意思:

比如:有兩種類型的紙幣1元和5元分別為兩張和三張。則他們的總共組合有這樣幾種情況。

(1+2x)*(1+3x^5)。

解釋一下(1+2x),x的指數指的是1元價值的紙幣,其x的係數是取其1元(也就是指數)有多少種方式。乘出來的式子也能用這種方式去解釋。

然後就是母函數的求法了。有種背包的思想在裡面,先把第一個式子(也可理解為第一種情況)加入背包中c1[i]。i表示取i有c1[i]種方法,一般初始都是1種。c1[0]也要注意初始化為1.然後從第二個式子開始背包處理,能夠塞入背包的就加上前面情況種數。臨時開一個數組存放資料,也就是c2[k+j]+=c1[j].每加上一個式子便將值更新至c1中,並將c2清零。

#include<iostream>#include<stdio.h>using namespace std;int main(){    int N;    int c1[125],c2[125];    while(cin>>N)    {        int i,j,k;        for(i=0;i<=N;i++)//初始化第一個運算式的係數        {            c1[i]=1;            c2[i]=0;        }        for(i=2;i<=N;i++)        {//從第二個運算式開始,因為有無限制個,所以有n個運算式            for(j=0;j<=N;j++)            {//從累乘的運算式後的一個運算式第一個到最後一個            if (c1[j]) //這個是我自己加的                 for(k=0;k+j<=N;k+=i)                {//k為第j個變數的指數,第i個運算式每次累加i                    c2[j+k]+=c1[j];                }            }            for(j=0;j<=N;j++)            {//滾動數組算完一個運算式後更新一次                c1[j]=c2[j];                c2[j]=0;            }        }        printf("%d\n",c1[N]);    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.