hdu1171 http://acm.hdu.edu.cn/showproblem.php?pid=1171

//给你每中物品的价值 和 该物品的数量 让你尽量把它们的总价值平均分配。
//注意细节 用母函数容易超时 注意 step sumMoney 以及 value*fac个代表的含义  step代表前一个数列式子的个数  sumMoney最大的指数  value*fac当前总价值
#include<stdio.h>
#include<string.h>
#define max  250003
int c1[max],c2[max];
int main()
{
    int N;
    int i,j,k;
    int value,fac;
    int sumMoney;
    int step;
    while(scanf("%d",&N)!=EOF)
    {
        if(N<0) break;
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        scanf("%d%d",&value,&fac);
        sumMoney=step=value*fac;
        for(i=0;i<=sumMoney;i+=value)
        {
            c1[i]=1;
            c2[i]=0;
        }
        for(i=1;i<N;i++)
        {
            scanf("%d%d",&value,&fac);
            sumMoney+=value*fac;
            for(j=0;j<=step;j++)
            {
                for(k=0;k<=value*fac;k+=value)
                  c2[k+j]+=c1[j];
            }
            step+=value*fac;
            for(int ii=0;ii<=sumMoney;ii++)
            {
                c1[ii]=c2[ii];
                c2[ii]=0;
            }
        }
       // printf("%d\n",sumMoney);
        for(j=sumMoney/2;j>=0;j--)
        {
            if(c1[j])
            {
                printf("%d %d\n",sumMoney-j,j);
                break;
            }
        }
    }
    return 0;
}

你可能感兴趣的:(hdu1171 http://acm.hdu.edu.cn/showproblem.php?pid=1171)