普通母函數(shù)(組合)

https://vjudge.net/problem/HDU-1398

#include <cstdio>
using namespace std;
const int maxn= 310;
// c1是保存各項質(zhì)量砝碼可以組合的數(shù)目
// c2是中間量秘蛔,保存每一次的情況
int c1[maxn], c2[maxn],step[20];
int main()
{   int n;
    for(int i=0;i<=17;i++)
        step[i]=i*i;
    while(scanf("%d",&n)!=EOF,n)
    {
        for(int i=0;i<=n;i++)
        {
            c1[i]=1;
            c2[i]=0;
        }
        for(int i=2;i*i<=n;i++)
        {
            for(int j=0;j<=n;j++)
            {
                for(int k=0;k+j<=n;k+=step[i])
                {
                    c2[j+k]+=c1[j];
                }
            }
            for(int j=0;j<=n;j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        printf("%d\n",c1[n]);
    }
    return 0;
}

https://vjudge.net/problem/HDU-1085
題意: 給你a個一元硬幣姆蘸,b個兩元硬幣昌渤,c個五元硬幣能岩,問不能湊出來的最小面額是多少沥阱。

#include <cstdio>
#include<string.h>
using namespace std;
const int maxn= 8010;
// c1是保存各項質(zhì)量砝碼可以組合的數(shù)目
// c2是中間量泣崩,保存每一次的情況
int c1[maxn], c2[maxn],step[5]={0,1,2,5};
int main()
{
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF,a+b+c)
    {
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(int i=0;i<=a;i++)
        {
            c1[i]=1;
        }
        for(int j=0;j<=a;j++)
        {
            for(int k=0;k<=b*2;k+=step[2])
            {
                c2[j+k]+=c1[j];
            }
        }
        for(int i=0;i<=a+b*2;i++)
        {
            c1[i]=c2[i];
            c2[i]=0;
        }
        for(int j=0;j<=a+b*2;j++)
        {
            for(int k=0;k<=c*5;k+=step[3])
            {
                c2[j+k]+=c1[j];
            }
        }
        for(int i=0;i<=a+b*2+c*5;i++)
        {
            c1[i]=c2[i];
            c2[i]=0;
        }
        int j;
        for(j=0;j<=a+b*2+c*5;j++)
        {
            if(c1[j]==0) {
                printf("%d\n",j);
                break;
            }
        }
        if(j==a+b*2+c*5+1) printf("%d\n",j);
    }
    return 0;
}

https://vjudge.net/problem/HDU-1171
題意:有n樣物品更卒,每樣物品價值是val[ i ]等孵,件數(shù)是num[ i ]。盡量把這些物品分成兩堆使得兩邊總價值最接近逞壁。輸出分得的兩堆各自的價值,價值大的在前面流济。
題解:假設(shè)物品i的價值為v,數(shù)量為n腌闯;則該物品的母函數(shù)為(1+xv+x2v+...+x(n-1)v+xnv)

#include <cstdio>
#include<string.h>
using namespace std;
const int maxn= 255555;
int c1[maxn], c2[maxn],val[55],num[55];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n>0)
    {
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        int total=0;
        for(int i=1;i<=n;i++) {
                scanf("%d%d",val+i,num+i);
                total+=val[i]*num[i];
        }
        for(int i=0;i<=num[1];i++)
            c1[i*val[1]]=1;

        int curr=num[1]*val[1];
        for(int i=2;i<=n;i++)
        {
            for(int j=0;j<=curr;j++)
            {
                for(int k=0;k<=num[i];k++)
                {
                    c2[j+k*val[i]]+=c1[j];
                }
            }
            curr+=num[i]*val[i];
            for(int j=0;j<=curr;j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        int j;
        for(j=total/2;j>=0;j--)
        {
            if(c1[j]) break;
        }
        printf("%d %d\n",total-j, j);
    }
    return 0;
}

https://vjudge.net/problem/HDU-1709
題意:有一個天平绳瘟,有n個砝碼,重量分別為wi姿骏,求出所有不能用天平測量的重量糖声。
題解:每個砝碼可以不用,也可以放左邊或者放右邊。

#include <cstdio>
#include<string.h>
using namespace std;
const int maxn= 22222;
int c1[maxn], c2[maxn],val[55],ans[maxn];
const int shift=10001;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(int i=1;i<=n;i++)
            scanf("%d",val+i);
        for(int i=-1;i<=1;i++)
            c1[i*val[1]+shift]=1;
        int curr=val[1]+shift,num=0,lef=shift-val[1];
        for(int i=2;i<=n;i++)
        {
            for(int j=lef;j<=curr;j++)
            {
                for(int k=-1;k<=1;k++)
                {
                    c2[j+k*val[i]]+=c1[j];
                }
            }
            curr+=val[i];
            lef-=val[i];
            for(int j=lef;j<=curr;j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        for(int i=lef;i<=curr;i++)
        {
            if(c1[i]==0&&i-shift>0)
            {
                ans[num++]=i-shift;
            }
        }
        printf("%d\n",num);
        if(num!=0) printf("%d",ans[0]);
        for(int i=1;i<num;i++)
        {
            printf(" %d",ans[i]);
        }
        if(num!=0) printf("\n");

    }
    return 0;
}

https://vjudge.net/problem/HDU-2069
題意:現(xiàn)在有價值為n的硬幣蘸泻,然后你有1,5,10,25,50的小硬幣琉苇。有多少種方法湊成價值為n的硬幣。注意:最多只能使用100個硬幣悦施。
題解:與一般母函數(shù)不同并扇,一般的母函數(shù)是控制每種硬幣的數(shù)量,或者是不控制抡诞,而此題控制的總的金幣數(shù)目不能超過100穷蛹,所以開一個二維數(shù)組來控制總的硬幣的數(shù)目。

#include <cstdio>
#include<string.h>
using namespace std;
const int maxn= 260;
int c1[maxn][110], c2[maxn][110];//第一維是系數(shù)昼汗,第二維是硬幣總數(shù)
int c3[maxn],val[6]={0,1,5,10,25,50};
int main()
{
    int n;
    memset(c1,0,sizeof(c1));
    memset(c2,0,sizeof(c2));
    for(int i=0;i<=100;i+=val[1])
    {
        c1[i][i]=1;
    }
    for(int i=2;i<=5;i++)
    {
        for(int j=0;j<=250;j++)
        {
            for(int k=0;j+k<=250;k+=val[i])
            {
                for(int p=0;p+k/val[i]<=100;p++)
                {
                    c2[j+k][p+k/val[i]]+=c1[j][p];//控制金幣總數(shù)不超過100
                }
            }
        }
        for(int j=0;j<=250;j++)
        {
            for(int p=0;p<=100;p++)
            {
                c1[j][p]=c2[j][p];
                c2[j][p]=0;
            }

        }
    }
    memset(c3,0,sizeof(c3));
    for(int i=0;i<=250;i++)
    {
        for(int j=0;j<=100;j++)
        {
            c3[i]+=c1[i][j];
        }
    }
    while(scanf("%d",&n)!=EOF)
    {
        if(n<0) printf("0\n");
       else printf("%d\n",c3[n]);

    }
    return 0;
}

https://vjudge.net/problem/HDU-2152

#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=110;
int c1[maxn],c2[maxn];
int lef[maxn],rig[maxn];
//把每種水果的價錢設(shè)置為1肴熏;則買m個水果相當于買m元水果。
//或者這樣理解:買m個水果顷窒,水果的個數(shù)就為母函數(shù)的指數(shù)蛙吏,個數(shù)的增值的步長每次都是1
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",lef+i,rig+i);
        }
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(int i=lef[1];i<=m&&i<=rig[1];i++)
        {
            c1[i]=1;
        }
        int st=min(lef[1],m),ed=min(rig[1],m);
        for(int i=2;i<=n;i++)
        {
            for(int j=st;j<=ed;j++)
            {
                for(int k=lef[i];k<=rig[i];k++)
                {
                    if(j+k<=m){
                        c2[j+k]+=c1[j];
                    }
                    else break;
                }
            }
            st=min(st+lef[i],m);
            ed=min(ed+rig[i],m);
            for(int j=st;j<=ed;j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        printf("%d\n",c1[m]);
    }
    return 0;
}

https://vjudge.net/problem/HDU-2082
題意:假設(shè)有x1個字母A, x2個字母B,..... x26個字母Z鞋吉,同時假設(shè)字母A的價值為1鸦做,字母B的價值為2,..... 字母Z的價值為26。那么坯辩,對于給定的字母馁龟,可以找到多少價值<=50的單詞呢?單詞的價值就是組成一個單詞的所有字母的價值之和漆魔,比如坷檩,單詞ACM的價值是1+3+14=18,單詞HDU的價值是8+4+21=33改抡。(組成的單詞與排列順序無關(guān)矢炼,比如ACM與CMA認為是同一個單詞)。

#include <cstdio>
#include<string.h>
using namespace std;
const int maxn=55;
long long c1[maxn],c2[maxn];
int num[30];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        for(int i=1;i<=26;i++)
        {
            scanf("%lld",num+i);
        }
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(int i=0;i<=num[1];i++){
            c1[i]=1;
        }
        for(int i=2;i<=26;i++)
        {
            for(int j=0;j<=50;j++)
            {
                for(int k=0;j+k*i<=50&&k<=num[i];k++)
                {
                    c2[j+k*i]+=c1[j];
                }
            }
            for(int j=0;j<=50;j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        long long sum=0;
        for(int i=1;i<=50;i++)
            sum+=c1[i];
        printf("%lld\n",sum);
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阿纤,一起剝皮案震驚了整個濱河市句灌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欠拾,老刑警劉巖胰锌,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異藐窄,居然都是意外死亡资昧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門荆忍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來格带,“玉大人撤缴,你說我怎么就攤上這事∵闯” “怎么了屈呕?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棺亭。 經(jīng)常有香客問我虎眨,道長,這世上最難降的妖魔是什么镶摘? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任专甩,我火速辦了婚禮,結(jié)果婚禮上钉稍,老公的妹妹穿的比我還像新娘。我一直安慰自己棺耍,他們只是感情好贡未,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒙袍,像睡著了一般俊卤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上害幅,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天消恍,我揣著相機與錄音,去河邊找鬼以现。 笑死狠怨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的邑遏。 我是一名探鬼主播佣赖,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼记盒!你這毒婦竟也來了憎蛤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纪吮,失蹤者是張志新(化名)和其女友劉穎俩檬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碾盟,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡棚辽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巷疼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晚胡。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡灵奖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出估盘,到底是詐尸還是另有隱情瓷患,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布遣妥,位于F島的核電站擅编,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箫踩。R本人自食惡果不足惜爱态,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望境钟。 院中可真熱鬧锦担,春花似錦、人聲如沸慨削。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缚态。三九已至磁椒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玫芦,已是汗流浹背浆熔。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桥帆,地道東北人医增。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像老虫,于是被迫代替她去往敵國和親调窍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • (一)巴什博弈只有一堆n個物品张遭,兩個人輪流從這堆物品中取物邓萨,規(guī)定每次至少取一個,最多取m個菊卷。最后取光者得勝缔恳。顯然,...
    Gitfan閱讀 931評論 0 0
  • https://vjudge.net/problem/HDU-3980題意: 兩個人在一個由 n 個玻璃珠組成的...
    Gitfan閱讀 931評論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗洁闰。 張土汪:刷leetcod...
    土汪閱讀 12,748評論 0 33
  • 今天主要讀詩歉甚,會了很多但不愿意指讀,昨晚我說我老了眼花看不見扑眉,你幫我指纸泄,你指到哪我就讀哪赖钞,兜寶很負責(zé)的指給我,有的...
    兜媽媽閱讀 321評論 0 0
  • 早上我起床聘裁,媽媽就干活去了雪营,等我給寶寶穿衣洗漱后,就匆匆吃早飯衡便,因為我們計劃今天出門——上街買菜献起。 熙熙攘攘的人群...
    云卷云舒2017閱讀 188評論 0 0