Description 题目描述
思路
DP,背包解法
代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,s[1001],x[1001],f[1001][12005],l=6001;
void init(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d%d",&s[i],&x[i]);
}
void work(){
memset(f,6001,sizeof(f));
f[1][s[1]-x[1]+l]=0;//不换的差
f[1][x[1]-s[1]+l]=1;//换的差
for(int i=2;i<=n;++i)
for(int j=-6000;j<=6000;++j) //所能获得的值
f[i][j+l]=min(f[i-1][j+l-(s[i]-x[i])],f[i-1][j+l+(s[i]-x[i])]+1);
//换或不换
}
void print(){
for(int i=0;i<=6000;++i)
if(f[n][i+l]<=6001||f[n][-i+l]<=6001){
printf("%d",min(f[n][i+l],f[n][-i+l]));
return;
}
}
int main(){
init();
work();
print();
}