hdu 1171 Big Event in HDU (母函数)

题意:

 给出n物品,每个物品有两个参数,价值v,数目m 求,将这些物品分成两份,这两份的价值差值最小。

母函数求解,注意初始化的不同

#include<stdio.h>

#include<string.h>

int v[55],num[55];

int a[300000],b[200000];

int main()

{

    int n,i,j,k;

    while(scanf("%d",&n)!=EOF)

    {

        if(n<0)break;

        int sum=0;

        for(i=1;i<=n;i++)

        {

            scanf("%d%d",&v[i],&num[i]);

            sum+=v[i]*num[i];



        }

         int d=(sum+1)/2;



        memset(a,0,sizeof(a));

        memset(b,0,sizeof(b));

        for(i=0;i<=num[1]*v[1];i+=v[1])

        {

            a[i]=1;

        }

        int h=num[1]*v[1];

        for(i=2;i<=n;i++)

        {



            for(j=0;j<=h;j++)

            {

                for(k=0;k<=num[i]*v[i];k+=v[i])

                {

                    b[k+j]+=a[j];

                }

            }

            

            h+=num[i]*v[i];

           for(j=0;j<=h;j++)

           {

               a[j]=b[j];

               b[j]=0;

           }

        }

        if(a[d]!=0)

        {

            printf("%d %d\n",d,sum-d);

        }

        else

        {

            for(i=d;i<=sum;i++)

            {

                if(a[i]!=0)break;

            }

            printf("%d %d\n",i,sum-i);

        }





    }

}

你可能感兴趣的:(event)