题目背景
小明和小红的感情,是慢慢发展起来的。
题目描述
他们对对方分别有一个好感值。定义两人的亲密程度为两人的好感值之和。
如果他们的亲密程度达到V,则他们将走到一起。他们以后的生活将取决于两人的好感值之差的绝对值,这个值越小,他们的生活将越幸福。
现在,他们对对方的好感值都为0,小明有N件事可以干,每件事可以增加他对小红的好感Ai点,并且增加小红对他的好感Bi点。(可能为负数)
小明可以任选一些事做,请你帮小明求出怎样才能让他们的生活更加幸福(求出两人在一起的前提下,好感值之差的最小绝对值即可)。
输入输出格式
输入格式:
第1行,两个正整数N,V。
之后N行,每行两个空格隔开的整数Ai,Bi。
输出格式:
一行,一个非负整数,表示两人在一起的前提下,好感值之差的最小绝对值。如果无论如何两人也无法在一起,输出-1.
输入输出样例
说明
对于20%数据,N<=10。
对于全部数据,N<=30,|Ai|,|Bi|<=100. 数据比较弱
#include<bits/stdc++.h> #define REP(i, a, b) for(int i = (a); i <= (b); ++ i) #define REP(j, a, b) for(int j = (a); j <= (b); ++ j) #define PER(i, a, b) for(int i = (a); i >= (b); -- i) using namespace std; const int maxn=1e5+5; template <class T> inline void rd(T &ret){ char c; ret = 0; while ((c = getchar()) < '0' || c > '9'); while (c >= '0' && c <= '9'){ ret = ret * 10 + (c - '0'), c = getchar(); } } struct node{ int tot,div; }e[maxn]; int n,v,p[maxn],dp[maxn],cnt; bool comp(node u,node v){ return u.tot>v.tot; } int main() { int now=0x3f3f3f3f; rd(n),rd(v); REP(i,1,n){ int s,t; cin>>s>>t; e[i].tot=s+t,e[i].div=t-s; if(s+t>0)cnt+=e[i].tot; } memset(dp,0x3f3f3f3f,sizeof(dp)); dp[0]=0; sort(e+1,e+1+n,comp); REP(i,1,n){ for(int j=cnt;j>=e[i].tot;j--){ if(abs(dp[j-e[i].tot]+e[i].div)<abs(dp[j])){ dp[j]=dp[j-e[i].tot]+e[i].div; if(dp[j]==0&&j>=v){ cout<<0<<endl; return 0; } } } } REP(i,v,cnt)if(now>abs(dp[i]))now=abs(dp[i]); if(now==0x3f3f3f3f)cout<<-1<<endl; else cout<<now<<endl; return 0; }