洛谷 P2080 增进感情
题目背景
小明和小红的感情,是慢慢发展起来的。
题目描述
他们对对方分别有一个好感值。定义两人的亲密程度为两人的好感值之和。
如果他们的亲密程度达到V,则他们将走到一起。他们以后的生活将取决于两人的好感值之差的绝对值,这个值越小,他们的生活将越幸福。
现在,他们对对方的好感值都为0,小明有N件事可以干,每件事可以增加他对小红的好感Ai点,并且增加小红对他的好感Bi点。(可能为负数)
小明可以任选一些事做,请你帮小明求出怎样才能让他们的生活更加幸福(求出两人在一起的前提下,好感值之差的最小绝对值即可)。
输入输出格式
输入格式:
第1行,两个正整数N,V。
之后N行,每行两个空格隔开的整数Ai,Bi。
输出格式:
一行,一个非负整数,表示两人在一起的前提下,好感值之差的最小绝对值。如果无论如何两人也无法在一起,输出-1.
输入输出样例
说明
对于20%数据,N<=10。
对于全部数据,N<=30,|Ai|,|Bi|<=100. 数据比较弱
思路:暴力:搜索+卡时。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,v,A,B,tot; int ans=0x7f7f7f7f; int a[350],b[350]; void dfs(int now,int sum){ tot++; if(tot==80000000){printf("%d",ans);exit(0);} if(sum>v) ans=min(ans,abs(A-B)); if(now==n+1) return ; A+=a[now];B+=b[now];dfs(now+1,sum+a[now]+b[now]);A-=a[now];B-=b[now]; dfs(now+1,sum); } int main(){ scanf("%d%d",&n,&v); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); dfs(1,0); if(ans==0x7f7f7f7f) cout<<"-1"; else cout<<ans; }
不去卡时,加一个小优化,就是当好感的差的绝对值是0时直接结束。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,v,A,B,tot; int ans=0x7f7f7f7f; int a[350],b[350]; void dfs(int now,int sum){ if(sum>v) ans=min(ans,abs(A-B)); if(ans==0){ cout<<ans;exit(0); } if(now==n+1) return ; A+=a[now];B+=b[now];dfs(now+1,sum+a[now]+b[now]);A-=a[now];B-=b[now]; dfs(now+1,sum); } int main(){ scanf("%d%d",&n,&v); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); dfs(1,0); if(ans==0x7f7f7f7f) cout<<"-1"; else cout<<ans; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。