题目背景
小明和小红的感情,是慢慢发展起来的。
题目描述
他们对对方分别有一个好感值。定义两人的亲密程度为两人的好感值之和。
如果他们的亲密程度达到 v,则他们将走到一起。他们以后的生活将取决于两人的好感值之差的绝对值,这个值越小,他们的生活将越幸福。
现在,他们对对方的好感值都为 0,小明有 n 件事可以干,每件事可以增加他对小红的好感 ai 点,并且增加小红对他的好感 bi 点。(可能为负数)
小明可以任选一些事做,请你帮小明求出怎样才能让他们的生活更加幸福(求出两人在一起的前提下,好感值之差的最小绝对值即可)。
输入格式
第一行,两个正整数 n,v。
之后 n 行,每行两个空格隔开的整数 ai,bi。
输出格式
一行,一个非负整数,表示两人在一起的前提下,好感值之差的最小绝对值。如果无论如何两人也无法在一起,输出 -1。
输入输出样例
输入 #1复制
4 15 5 6 -1 8 7 2 1 0
输出 #1复制
3
对于这n种事情,每种事情可以选择做或者不做,这里的n最大是30,每个事情的两种选择,2的30次方大概1e9,会超时,所以我们在最优情况:总和大于等于v并且好感值之差的绝对值等于零时,就没有再进行优化的的可能了,就直接输出零了
否则就枚举选与不选两种选择,最后解出最优答案(最小值)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int b[N];
int n,v;
int mn=INT_MAX;
void dfs(int t,int x,int y){
if(x==y&&(x||y)){
if(x+y>=v)mn=0;
return;
}
if(t==n+1){
if(x+y>=v)mn=min(mn,abs(x-y));
return;
}
dfs(t+1,x+a[t],y+b[t]);
dfs(t+1,x,y);
}
signed main(){
ios::sync_with_stdio(0);
cin>>n>>v;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
dfs(1,0,0);
if(mn==INT_MAX)mn=-1;
cout<<mn;
}
239

被折叠的 条评论
为什么被折叠?



