f[j]=max(f[j],f[j-k*v[i]]+k*v[i])。内层循环时逆序。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/9/10.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=255555;
int f[maxn],v[maxn],c[maxn];
int main()
{
int n;
while(scanf("%d",&n)&&n>0)
{
memset(f,0,sizeof(f));
int sum=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&v[i],&c[i]);
sum+=v[i]*c[i];
}
for(int i=0;i<n;i++)
{
int l=c[i],k=1;
while(l>k)
{
for(int j=sum/2;j>=k*v[i];j--)
f[j]=max(f[j],f[j-k*v[i]]+k*v[i]);
l-=k;
k<<=1;
}
for(int j=sum/2;j>l*v[i];j--)
f[j]=max(f[j],f[j-l*v[i]]+l*v[i]);
}
cout<<sum-f[sum/2]<<" "<<f[sum/2]<<endl;
}
return 0;
}