假设骨牌总差为j,第i块骨牌差为xi,

则前i块骨牌差为j的骨牌最小交换次数=

  1. 前i-1块骨牌,差为j减去当前骨牌的差 => 即 等于前i-1个骨牌差为j-xi的交换次数 –>当前骨牌不交换
  2. 前i-1块骨牌,差为j加上当前骨牌的差 => 加上了即 交换次序
#include <cstdio>
using namespace std;
const int sm=5000;
int n,a[1005],b[1005],fm[1005][15000];
int min(int a,int b){return a>b?b:a;}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
    for(int i=0;i<=n;i++)for(int j=-5000;j<=5000;j++)fm[i][j+sm]=1<<30;
    //fm[1][a[1]-b[1]+sm]=0;fm[1][b[1]-a[1]+sm]=1;
    fm[0][sm]=0;
    for(int i=1;i<=n;i++){
        for(int j=-5000;j<=5000;j++){
            int sum=a[i]-b[i];
            fm[i][j+sm]=min(fm[i-1][j-sum+sm],fm[i-1][j+sum+sm]+1);
        }
    }
    int ans;
    for(int i=0;i<=5000;i++){
        ans=min(fm[n][i+sm],fm[n][-i+sm]);
        if(ans<=1000){printf("%d",ans);break;}
    }
    return 0;
}