#include<bits/stdc++.h>
using namespace std;
#define ppp optimize
#pragma GCC ppp("-Ofast")
#pragma GCC ppp(3,"-Ofast","inline")
#pragma GCC ppp(4,"-Ofast","inline")
#pragma GCC ppp(5,"-Ofast","inline")
#pragma GCC ppp(6,"-Ofast","inline")
#pragma GCC ppp(2,"-Ofast","inline")
#pragma GCC ppp(7,"-Ofast","inline")
#define flush() fwrite(obuf,1,O-obuf,stdout)
#define putchar(x) ((O==obuf+(1<<21))&&(flush(),O=obuf)),*O++=x
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline int read() {
register int x=0,f=1;register char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
return x*f;
}
inline void write(register long long x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar((x%10)^48);
}
struct Flush{
~Flush(){flush();}
}_;
int Arr[1010],Brr[1010],nz[1010];
unordered_map<int,int> dp;
unordered_map<int,bool> book;
main(){
int n=read(),Sum_First=0,Sum_Second=0;
for(int i=1;i<=n;i++){
Arr[i]=read(),Brr[i]=read();
Sum_First+=Arr[i],Sum_Second+=Brr[i];
}
int cz=Sum_First-Sum_Second;
for(int i=1;i<=n;i++) nz[i]=2*Brr[i]-2*Arr[i];
dp[cz]=0;
book[cz]=true;
for(int i=1;i<=n;i++){
for(int j=-6000;j<=6000;j++){
if(book[j-nz[i]]){
if(!book[j]) dp[j]=dp[j-nz[i]]+1;
else dp[j]=min(dp[j-nz[i]]+1,dp[j]);
book[j]=true;
}
}
}
for(int i=0,j=0;i<=6000&&j>=-6000;i++,j--){
if(book[i]&&book[j]){
cout<<min(dp[i],dp[j]);
return 0;
}else if(book[i]){
cout<<dp[i];
return 0;
}else if(book[j]){
cout<<dp[j];
return 0;
}
}
}