//多重背包做法
#include<iostream>
#define max(a, b) (a>b?a:b)
#define M 100005
using namespace std;
int dp[M], c[M], w[M];
int v;
void Bag01(int cost, int wei)//01
{
int i;
for( i=v; i >=cost; i-- )
dp[i] = max(dp[i], dp[i-cost]+wei);
}
void Complete(int cost, int wei)//完全
{
int i;
for( i=cost; i <= v; i++ )
dp[i] = max(dp[i], dp[i-cost]+wei);
}
void Multiple(int cost, int wei, int cnt)//多重
{
if(v <= cnt*cost)//如果总容量比这个物品的容量要小,那么这个物品可以直到取完,相当于完全背包
{
Complete(cost, wei);
return ;
}
else//否则就将多重背包转化为01背包
{
int k=1;
while(k <= cnt)
{
Bag01(k*cost, k*wei);
cnt = cnt-k;
k = 2*k;
}
Bag01(cnt*cost, cnt*wei);
}
}
int main()
{
int n;
while(scanf("%d", &n) && n>0)
{
int i;
v=0;
for( i=0; i < n; i++ )
{
scanf("%d%d", &c[i], &w[i]);
v += c[i]*w[i];
}
int sum=v;
v /= 2;
memset(dp, 0, sizeof(dp));
for( i=0; i < n; i++ )
Multiple(c[i], c[i], w[i]);
printf("%d %d\n", sum-dp[v], dp[v]);
}
return 0;
}