#include<cstdio>#include<iostream>#include<cstring>#define M 6000//上限。usingnamespace std;int n,k,a[1001],b[1002],f[1006][10800];//数组要开得特别大,否则会RE。intmain(){memset(f,127/3,sizeof(f));//给f赋个大值。scanf("%d",&n);//输入。
f[0][M]=0;//初值,从0开始,因为有负数,所以从M开始,上限是12000(6000),下限是0(-6000)for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);//输入。for(int i=1;i<=n;i++)for(int j=1;j<=M*2;j++)//j to 上限 do
f[i][j]=min(f[i-1][j-a[i]+b[i]],f[i-1][j+a[i]-b[i]]+1);//逗号左边的是不翻,右边是翻
k=0;//从0开始。while((f[n][M+k]==f[0][1])&&(f[n][M-k]==f[0][1])) k++;//f[0][1]为一开始的值,有变化时说明可以翻成差值为k。printf("%d",min(f[n][M+k],f[n][M-k]));//输出最小值。return0;}