学习数据结构的第十八天www
俗话说得好,船到桥头自然直。做了一丝丝搜索的题目我感觉还是有点小困难的。但是吧,只要有信念,就一定会成功。来先看题目。
增进感情
题目背景
小明和小红的感情,是慢慢发展起来的。
题目描述
他们对对方分别有一个好感值。定义两人的亲密程度为两人的好感值之和。
如果他们的亲密程度达到 v v v,则他们将走到一起。他们以后的生活将取决于两人的好感值之差的绝对值,这个值越小,他们的生活将越幸福。
现在,他们对对方的好感值都为 0 0 0,小明有 n n n 件事可以干,每件事可以增加他对小红的好感 a i a_i ai 点,并且增加小红对他的好感 b i b_i bi 点。(可能为负数)
小明可以任选一些事做,请你帮小明求出怎样才能让他们的生活更加幸福(求出两人在一起的前提下,好感值之差的最小绝对值即可)。
输入格式
第一行,两个正整数 n , v n,v n,v。
之后 n n n 行,每行两个空格隔开的整数 a i , b i a_i,b_i ai,bi。
输出格式
一行,一个非负整数,表示两人在一起的前提下,好感值之差的最小绝对值。如果无论如何两人也无法在一起,输出 -1
。
样例 #1
样例输入 #1
4 15
5 6
-1 8
7 2
1 0
样例输出 #1
3
提示
数据范围与约定
- 对于 20 % 20\% 20% 数据,保证 n ≤ 10 n \le 10 n≤10。
- 对于
100
%
100\%
100% 数据,保证
1
≤
n
≤
30
1 \le n \le 30
1≤n≤30,
1
≤
∣
a
i
∣
,
∣
b
i
∣
≤
100
1 \le \left\vert a_i\right\vert,\left\vert b_i\right\vert \le 100
1≤∣ai∣,∣bi∣≤100。
一看到这种题目先分析思路,首先,搜索的内容是什么?题目讲到,是两者的好感差的最小绝对值,那么,这就是我们要搜的内容,也就是终止条件。另外,值得注意的是v是指两者和的好感度,不是两者都要达到这么高的好感度。还有一点,当绝对值为0时,就是最幸福的状态了,不需要另外再搜索了。我们可以建立一个二维数组来存储两人做每件事情的好感度。下面就看代码吧!
#include <iostream>
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int arr[31][2];
int book[31];
int n,v,q=0,w=0,sam=10086;//因为这道题目的数据较弱,10086完全可以胜任最大的值从而被替换
void aiqing(int u)
{
if(q+w>v)//判断条件
{
sam=min(sam,abs(q-w));//绝对值函数很重要
}
if(sam==0)
{
return;//为零了直接跳出就好了
}
for(int yet=u;yet<=n;yet++)
{
if(book[yet]==0)
{
book[yet]=1;//标记已经做过
q+=arr[yet][0];//q代表的是小明的累计好感度
w+=arr[yet][1];//w代表的是小红的累计好感度
aiqing(yet);//递归搜索
q-=arr[yet][0];//收回
w-=arr[yet][1];//收回
book[yet]=0;//收回
}
}
}
int main()
{
cin>>n>>v;//输入
for(int i=1;i<=n;i++)
{
scanf("%d%d",&arr[i][0],&arr[i][1]);//输入
}
aiqing(1);
if(sam==10086)
{
printf("-1");//如果等于原来的数就无法在一起。作者你好刀啊
}
else{
cout << sam << endl;//输出
}
return 0;
}
加油吧少年。