hdu 2082+hdu1028+poj1014+hdu1521 普通母函数+指数型母函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37428263/article/details/83832032

hdu2082

题目传送门

//母函数
#include<bits/stdc++.h>
using namespace std;
const int maxn=50+5;
int a[maxn],b[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        a[0]=1;
        for(int i=1;i<=26;i++)
        {
            int num;
            scanf("%d",&num);
            if(num==0) continue;
            for(int j=0;j<=50;j++)
            {
                for(int k=0;k<=num&&k*i+j<=50;k++)
                {
                    b[k*i+j]+=a[j];
                }
            }
            for(int k=0;k<=50;k++)
            {
                a[k]=b[k];
                b[k]=0;
            }
        }
        int solve=0;
        for(int i=1;i<=50;i++)
        {
            solve+=a[i];
        }
        cout<<solve<<endl;
    }
    return 0;
}

hdu 1028

题目传送门

//母函数
#include<bits/stdc++.h>
using namespace std;
const int maxn=120+5;
int a[maxn],b[maxn];
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        for(int i=0;i<=n;i++)
        {
            b[i]=0;
            a[i]=1;
        }
        for(int i=2;i<=n;i++)
        {
            for(int j=0;j<=n;j++)
            {
                for(int k=0;k+j<=n;k+=i)
                {
                    b[j+k]+=a[j];
                }
            }
            for(int k=0;k<=n;k++)
            {
                a[k]=b[k];
                b[k]=0;
            }
        }
        cout<<a[n]<<endl;
    }
    return 0;
}

poj 1014

题目传送门

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100+5;
int f[maxn],b[maxn];
int main()
{
    int kase=0;
    while(1)
    {
        int a[10],t=0,value=0;
        for(int i=1;i<=6;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]>=8) {
                if(a[i]&1) a[i]=11;
                else a[i]=12;
            }
            value+=a[i]*i;
            if(a[i]==0) t++;
        }
        if(t==6) break;
        bool flag=true;
        printf("Collection #%d:\n",++kase);
        if(value&1) flag=false;
        else {
            value/=2;
            memset(f,0,sizeof(int)*value);
            memset(b,0,sizeof(int)*value);
            f[0]=1;
            for(int i=1;i<=6;i++)
            {
                if(a[i]==0) continue;
                for(int j=0;j<=value;j++)
                {
                    for(int k=0;k<=a[i]&&k*i+j<=value;k++)
                    {
                        b[k*i+j]+=f[j];
                    }
                }
                memcpy(f,b,sizeof(b));
                memset(b,0,sizeof(int)*value);
                if(f[value]>0) break;
            }
            if(f[value]==0) flag=false;
        }
        if(flag) printf("Can be divided.\n\n");
        else printf("Can't be divided.\n\n");
    }
    return 0;
}

hdu 1521

题目传送门

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=10+5;
int main()
{
    double fac[maxn];
    fac[0]=fac[1]=1;
    for(int i=2;i<=10;i++)
        fac[i]=fac[i-1]*(double)i;
    int n,m;
    while(scanf("%d%d",&n,&m)==2)
    {
        double a[maxn];
        for(int i=0;i<n;i++)
            scanf("%lf",&a[i]);
        double num1[maxn],num2[maxn];
        for(int i=0;i<=m;i++)
        {
            num1[i]=0.0;
            num2[i]=0.0;
        }
        for(int i=0;i<=a[0];i++)
        {
            num1[i]=1.0/fac[i];
        }
        for(int i=1;i<n;i++)
        {
            if(a[i]==0) continue;
            for(int j=0;j<=m;j++)
            {
                for(int k=0;k<=a[i]&&k+j<=m;k++)
                {
                    num2[k+j]+=num1[j]*(1.0/fac[k]);
                }
            }
            for(int j=0;j<=m;j++)
            {
                num1[j]=num2[j];
                num2[j]=0;
            }
        }
        printf("%.0lf\n",fac[m]*num1[m]*1.0);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37428263/article/details/83832032