ACM_模板_母函数

来源:互联网 发布:阿里旺旺软件下载 编辑:程序博客网 时间:2024/05/17 23:25

母函数作为一类数学思维的转换运用,由于算法本身很好理解,其关键也是是一套模板的灵活运用,所以也没什么好讲的,小编以整数拆分为例,给出小编母函数的模板。

#include <stdio.h>//母函数 #define maxn 10000int c1[maxn+1],c2[maxn+1];int main(){int n,i,j,k;while(scanf("%d",&n)!=EOF){for(i=0;i<=n;i++){c1[i]=0; c2[i]=0;}for(i=0;i<=n;i++) c1[i]=1;for(i=2;i<=n;i++){ for(j=0;j<=n;j++) for(k=0;k+j<=n;k+=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;}

关于母函数,还有一个经典的运用,那就是天平秤,因为天平的砝码可以放到天平的两侧来实现,所以在母函数的运用上也是一个经典的变形。

#include<cstdio>  #include<cstring>  #include<cstdlib>  #include<algorithm>using namespace std;int c1[2010],c2[2010];int a[22];int main(){int t,n,m,i,j,k,sum,num;scanf("%d",&t);while(t--){sum=0;scanf("%d",&n);        for(i=1;i<=n;++i)        {            scanf("%d",&a[i]);            sum+=a[i];        }memset(c1,0,sizeof(c1));        memset(c2,0,sizeof(c2));        c1[0]=c1[a[1]]=1;        for(i=2;i<=n;i++)        {            for(j=0;j<=sum;j++)            {                for(k=0;k<=a[i]&&k+j<=sum;k+=a[i])                {                    c2[k+j]+=c1[j];                    c2[abs(j-k)]+=c1[j];                }            }            for(j=0;j<=sum;j++)            {                c1[j]=c2[j];                c2[j]=0;            }        }        scanf("%d",&m);        while(m--)        {            scanf("%d",&num);            if(num>sum)            {                printf("NO\n");                continue;            }            if(c1[num])                printf("YES\n");            else                printf("NO\n");        }}    return 0;}


0 0
原创粉丝点击