代码:

//
// Created by 徐志远 on 2019-09-26.
//
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 210
int f[N];
//f[N] 表示 当底部为消耗了厚度为N时上方得到的最小的长度
int n;
int v[N],w[N];

int main(){
    cin>>n;
    int all = 0;
    for(int i = 1;i <= n;i++){
        cin>>v[i]>>w[i];
        all += v[i];
    }

    f[0]  =0;
    for(int i =1;i<=all;i++) f[i]  = 500;

    for(int i =1;i<=n;i++){
        for(int j = all;j>=v[i];j--){
            f[j] = min(f[j],f[j-v[i]]+w[i]);
        }
    }

    int ans = 0;
    for(int i = all;i>=0;i--){
        if(all-i>=f[i]){
            ans = all-i;
            break;
        }
    }

    cout<<ans<<endl;


    return 0;
}