module main; // https://kmjp.hatenablog.jp/entry/2015/07/19/1000 より // 動的計画法 import std; void main() { // 入力 auto N = readln.chomp.to!int; auto V = new int[](N), T = new int[](N); foreach (i; 0 .. N) readln.chomp.formattedRead("%d %d", V[i], T[i]); // 答えの計算と出力 alias P = Tuple!(int, int); auto pair = new P[](N); foreach (i; 0 .. N) pair[i] = P(V[i] + T[i], i); pair.sort; auto ok = new bool[](20_001); ok[0] = true; foreach (i; 0 .. N) foreach_reverse (x; 0 .. T[pair[i][1]]) if (ok[x]) ok[x + V[pair[i][1]]] = 1; foreach_reverse (i; 0 .. 20_001) { if (ok[i]) { writeln(i); return; } } }