【无标题】

学习数据结构的第十八天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 n10
  • 对于 100 % 100\% 100% 数据,保证 1 ≤ n ≤ 30 1 \le n \le 30 1n30 1 ≤ ∣ a i ∣ , ∣ b i ∣ ≤ 100 1 \le \left\vert a_i\right\vert,\left\vert b_i\right\vert \le 100 1ai,bi100
    一看到这种题目先分析思路,首先,搜索的内容是什么?题目讲到,是两者的好感差的最小绝对值,那么,这就是我们要搜的内容,也就是终止条件。另外,值得注意的是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;
}

加油吧少年。

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值