dfs例题

话不多说,这里直接举例洛谷p2080,题目要求绝对值的最小差值,这里就需要使用函数abs,首先先写主函数代码输入值,这里简略,代码如下:

scanf("%d %d",&n,&v);
	for(int i=0;i<n;i++) scanf("%d %d",&a[i],&b[i]);

这题目是一道比较好进行搜索的一道题目,接下来咱们进行搜索使用dfs,然后就是写dfs函数,在写dfs函数时,需要知道最小差值为0,所以当最小值为0的时候,直接返回,这里最小值使用min函数,但是前提都是需要两个好感值之和大于v,代码如下:

if(za+zb>v) {minn=min(abs(za-zb),minn);}
	if(minn == 0) return ;

这里就开始写dfs核心内容,我们可以定义一个数组,使得数组初始化全部为0,当我们使用完一个数组值后重新进行初始化使得该被用了的值为1,再进行分别加上好感值,继续进行下一次搜索即为dfs(i+1),这里需要注意,进行下一次搜索后需要回溯,并且需要减去上次加上的值,代码如下:

for(int i=step;i<n;i++)
	{
		if(book[i] == 0)
		{
			book[i]=1;
			za+=a[i];
			zb+=b[i];
			dfs(i+1);
			book[i]=0;
			za-=a[i];
			zb-=b[i];
		}
	}

总代码如下:

#include<bits/stdc++.h>
using namespace std;
int za,zb,a[40],b[40],n,v,minn=99999999,book[40];
void dfs(int step)
{
	if(za+zb>v) {minn=min(abs(za-zb),minn);}
	if(minn == 0) return ;
	for(int i=step;i<n;i++)
	{
		if(book[i] == 0)
		{
			book[i]=1;
			za+=a[i];
			zb+=b[i];
			dfs(i+1);
			book[i]=0;
			za-=a[i];
			zb-=b[i];
		}
	}
}
int main()
{
	scanf("%d %d",&n,&v);
	for(int i=0;i<n;i++) scanf("%d %d",&a[i],&b[i]);
	dfs(0);
	if(minn == 99999999) printf("-1");
	else printf("%d",minn);
	return 0;
}

好了,这道题在此已经解决,需要注意的点就是回溯,接下来继续学习吧

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜杨杨349

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值