HDU 母函数简单题

来源:互联网 发布:imp oracle 导入数据 编辑:程序博客网 时间:2024/05/22 09:50

简单的四道母函数题。都做了2遍,一次母函数,一次计数DP(或叫背包)。

但是这几题背包的效率比母函数高,而且代码也短多了。。。


HDU 1028 Ignatius and the Princess III

代码:

#include <stdio.h>#include <iostream>#include <string.h>#include <math.h>#include <algorithm>#include <map>using namespace std;#define LL long longint c1[130];int c2[120];int main(){    int n;    while(~scanf("%d",&n))    {        for(int i=0;i<=n;i++)        {            c1[i]=1;            c2[i]=0;        }        for(int i=2;i<=n;i++)        {            for(int j=0;j<=n;j++)            {                for(int k=0;k+j<=n;k+=i)                {                    c2[k+j]+=c1[j];                }            }            for(int i=0;i<=n;i++)            {                c1[i]=c2[i];                c2[i]=0;            }        }        printf("%d\n",c1[n]);    }    return 0;}

HDU 2082 找单词

代码:

#include <stdio.h>#include <iostream>#include <string.h>#include <math.h>#include <algorithm>#include <map>using namespace std;#define LL long longint c1[55];int c2[55];int main(){    int T;    scanf("%d",&T);    while(T--)    {        memset(c1,0,sizeof c1);        memset(c2,0,sizeof c2);        c1[0]=1;        for(int i=1;i<=26;i++)        {            int a;scanf("%d",&a);            for(int j=0;j<=50;j++)            {                for(int k=0,num=0;j+k<=50&&num<=a;k+=i,num++)                {                    c2[k+j]+=c1[j];                }            }            for(int j=0;j<=50;j++)            {                c1[j]=c2[j];                c2[j]=0;            }        }        int ans=0;        for(int i=1;i<=50;i++)        {            ans+=c1[i];        }        printf("%d\n",ans);    }            return 0;}

HDU 1398 Square Coins

代码:

#include <stdio.h>#include <iostream>#include <string.h>#include <math.h>#include <algorithm>#include <map>using namespace std;#define LL long longconst int N = 300+6;int c1[N];int c2[N];int coin[20];void init(){    for(int i=1;i<=17;i++)    {        coin[i]=i*i;    }}int main(){    int n;    init();    while(~scanf("%d",&n)&&n)    {        for(int i=0;i<=n;i++)        {            c1[i]=1,c2[i]=0;        }        for(int i=2;i<=17&&coin[i]<=n;i++)        {            for(int j=0;j<=n;j++)            {                for(int k=0;k+j<=n;k+=coin[i])                {                    c2[k+j]+=c1[j];                }            }            for(int j=0;j<=n;j++)                c1[j]=c2[j],c2[j]=0;        }        printf("%d\n",c1[n]);                }    return 0;}

HDU 1085 Holding Bin-Laden Captive!

代码:

#include <stdio.h>#include <iostream>#include <string.h>#include <math.h>#include <algorithm>#include <map>using namespace std;#define LL long longconst int N = 300+6;int vis[9000];int main(){    int b[3]={1,2,5};    int a[3];    while(~scanf("%d %d %d",&a[0],&a[1],&a[2]))    {        if(!(a[0]+a[1]+a[2])) break;        int maxx=0;        for(int i=0;i<3;i++)        {            maxx+=a[i]*b[i];        }        memset(vis,0,sizeof vis); vis[0]=1;        for(int i=0;i<3;i++)        {            for(int j=maxx;j>=0;j--)            {                                for(int k=0,num=0;num<=a[i];k+=b[i],num++)                {                    if(vis[j]) vis[k+j]=1;                }            }        }                for(int i=1;i<=maxx+1;i++)        {            if(vis[i]==0)            {                printf("%d\n",i);                break;            }        }    }    return 0;}


原创粉丝点击