#include<iostream> using namespace std; int a[105][2]; int c1[255005],c2[255005]; //50*50*100 int main() { int n,i,j,k,t,sum; while(scanf("%d",&n)!=EOF&&n>=0) { sum=0; for(i=0;i<n;i++) { scanf("%d %d",&a[i][0],&a[i][1]); //价值 ; 数量 sum+=a[i][0]*a[i][1]; } for(i=0;i<=sum;i++) c1[i]=0,c2[i]=0; for(i=0;i<=a[0][1];i+=a[0][0]) c1[i]=1; int s=sum/2; //在for(;;;)语句中尽量不要有计算 这样会减慢速度 for(i=0;i<n;i++) { for(j=0;j<=s;j++) for(k=0,t=a[i][1]+1;k+j<=s&&t--;k+=a[i][0])//t控制次数 c2[k+j]+=c1[j]; for(j=0;j<=s;j++) {c1[j]=c2[j];c2[j]=0;} } //for(i=0;i<=sum;i++) printf("c1[%d]=%d /n",i,c1[i]); for(i=s;!c1[i];i--);//刘改 非常简洁 cout<<sum-i<<" "<<i<<endl; } system("pause"); return 0; } http://acm.hdu.edu.cn/showproblem.php?pid=1171