#include #define REP(i,n) for(int i=0;i<(int)(n);i++) #define ALL(x) (x).begin(),(x).end() #define LL long long using namespace std; int main(){ int n; cin>>n; LL A[n]; LL B[n]; REP(i,n)cin>>A[i]>>B[i]; LL sumA=0; REP(i,n)sumA+=A[i]; REP(i,n)B[i]+=A[i]; vector vecA; vector vecB; int half=n/2; REP(i,1<>j & 1){ num+=B[j]; } } vecA.push_back(num); } REP(i,1<<(n-half)){ LL num=0; REP(j,n-half){ if(i>>j & 1){ num+=B[j+half]; } } vecB.push_back(num); } sort(ALL(vecA)); sort(ALL(vecB)); LL minimum = 10000000000000000L; REP(i,vecA.size()){ LL va = vecA[i]; vector::iterator itr = lower_bound(vecB.begin(),vecB.end(),sumA-va); if(itr!=vecB.end()){ minimum=min(minimum,abs(sumA-(va + *itr))); } itr--; LL ans2=va+ *itr; minimum = min(minimum,abs(sumA-ans2)); } cout<