http://acm.hdu.edu.cn/showproblem.php?pid=1171
#include<iostream>
#include<iomanip>
using namespace std;
int v,dp[2000000];
void bag01(int cost,int weight)
{
for(int i=v;i>=cost;i--)
if(dp[i]<dp[i-cost]+weight)
dp[i]=dp[i-cost]+weight;
}
void complete(int cost,int weight)
{
for(int i=cost;i<=v;i++)
if(dp[i]<dp[i-cost]+weight)
dp[i]=dp[i-cost]+weight;
}
void multiply(int cost,int weight,int amount)
{
int k=0;
if(cost*amount>=v)
complete(cost,weight);
else{
k=1;
while(k<amount){
bag01(k*cost,k*weight);
amount-=k;
k+=k;
}
bag01(cost*amount,weight*amount);
}
}
int main()
{
int T,sum,i,w[55],num[55];
while(scanf("%d",&T))
{
sum=0;
fill(dp,dp+200000,0);
if(T<=0)break;
for(i=1;i<=T;i++)
{
scanf("%d%d",&w[i],&num[i]);
sum+=w[i]*num[i];
}
v=sum/2;
for(i=1;i<=T;i++)
{
multiply(w[i],w[i],num[i]);
}
printf("%d %d\n",sum-dp[v],dp[v]);
}
return 0;
}