f[i][j]表示前i个的差是多少的最小步
f[i][j]=min(f[i−1][j+a[i]−b[i]],f[i−1][j−a[i]+b[i]]);
递推过去,最后求最小差
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int M=5000;
int V,n,w[1999],v[1999],k[1999],f[1999][2*M+10];
int main(){
scanf("%d%",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);
memset(f,127,sizeof(f));
f[0][0+M]=0;
for(int i=1;i<=n;i++)
for(int j=-M;j<=M;j++){
f[i][j+M]=min(f[i-1][j-v[i]+w[i]+M],f[i-1][j-w[i]+v[i]+M]+1);
}
for(int i=0;i<=M;i++)
if(f[n][M-i]<1000||f[n][i+M]<1000) {
printf("%d",min(f[n][i+M],f[n][M-i]));break;
}
}