原题:http://acm.hdu.edu.cn/showproblem.php?pid=1171
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 100;
const int maxm = 5e5;
int dp[maxm], tmp[maxm];
int val[maxn], num[maxn];
int main(){
int n;
while(cin>>n){
if(n <= 0) break;
int sum = 0;
for(int i = 0;i<n;i++){
cin>>val[i]>>num[i];
sum += (val[i]*num[i]);
}
memset(dp, 0, sizeof dp);
memset(tmp, 0, sizeof tmp);
for(int i = 0;i<=num[0]*val[0];i+=val[0])
dp[i] = 1;
int Max = num[0]*val[0];
for(int i = 1;i<n;i++){
for(int j = 0;j<=Max;j++){
for(int k = 0;k<=num[i]*val[i];k+=val[i]){
tmp[j+k] += dp[j];
}
}
Max += num[i]*val[i];
for(int j = 0;j<=Max;j++){
dp[j] = tmp[j];
tmp[j] = 0;
}
}
for(int i = sum/2;i>=0;i--){
if(dp[i]!=0){
cout<<sum-i<<" "<<i<<endl;
break;
}
}
}
return 0;
}