#include<bits/stdc++.h>
using namespace std;
int n,a,b,f[10000005],ans=0,s=0;
int main(){
memset(f,1e9,sizeof(f));//全部赋为超大值
//f[i]代表达到i时的最小翻转次数,于是f[0]设为
//0,其余为超大值
f[0]=0;
cin>>n;
for(int i=1;i<=n;i++){//枚举1到n
cin>>a>>b;
s+=a+b;//累加上下点数
for(int i=s;i>=0;i--){//0-1背包倒着枚举
if(f[i]!=1e9){//如果它没用过
f[i+a]=min(f[i+a],f[i]);//不翻转
f[i+b]=min(f[i+b],f[i]+1);//翻转
f[i]=1e9;//用过后设为极大值
}
}
}
int pre=s/2;//把s/2存储下来
if(s%2==0){
for(int i=0;i<pre;i++){
ans=min(f[pre-i],f[pre+i]);
if(ans!=1e9){//如果不是极大值
cout<<ans<<endl;//输出答案
return 0;
}
}
}else{
for(int i=1;i<=pre;i++){
ans=min(f[pre-i+1],f[pre+i]);
if(ans!=1e9){//如果不是极大值
cout<<ans<<endl;//输出答案
return 0;
}
}
}
return 0;
}
求答复