学习陈新大神代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 1050;
int n;
int dp[maxn*12],p[maxn*6]; //dp[i]
bool cmp( int a,int b )
{
return a > b;
}
int fun( int cur )
{
if( cur < 0 ){ //如果初始绝对值小于0 调整为大于0
for( int i = 0; i < n; i ++ )
p[i] = -p[i];
cur = -cur;
}
dp[cur] = 0; //初始状态赋为0
sort(p,p+n); //从大到小排序
for( int i = 0; i < n; i ++ )
for( int j = 0; j <= 2*6*n; j ++ )
if( j + p[i]*2 >= 0 && dp[j + p[i]*2] != -1 )
if( dp[j] == -1 )
dp[j] = dp[j + p[i]*2] + 1;
else
dp[j] = min( dp[j],dp[j + p[i]*2]+1 );
for( int i = 0; i <= cur; i ++ )
if( dp[i] != -1 )
return dp[i];
}
int main()
{
//freopen("data.txt","r",stdin);
int cur = 0,u,d;
scanf("%d",&n);
memset(dp,-1,sizeof(dp));
for( int i = 0; i < n; i ++ ){
scanf("%d%d",&u,&d);
p[i] = u-d;
cur += p[i];
}
printf("%d\n",fun( cur ));
return 0;
}