P2080 增进感情

题目背景

小明和小红的感情,是慢慢发展起来的。

题目描述

他们对对方分别有一个好感值。定义两人的亲密程度为两人的好感值之和。

如果他们的亲密程度达到 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;
}

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值