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

来源:互联网 发布:淘宝兼职旺旺客服 编辑:程序博客网 时间:2024/05/16 04:35
//给你每中物品的价值 和 该物品的数量 让你尽量把它们的总价值平均分配。//注意细节 用母函数容易超时 注意 step sumMoney 以及 value*fac个代表的含义  step代表前一个数列式子的个数  sumMoney最大的指数  value*fac当前总价值#include<stdio.h>#include<string.h>#define max  250003int 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;}