//给你每中物品的价值 和 该物品的数量 让你尽量把它们的总价值平均分配。 //注意细节 用母函数容易超时 注意 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; }