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);
        }


    }
}
原文地址:https://www.cnblogs.com/acSzz/p/2597065.html