话不多说,这里直接举例洛谷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;
}
好了,这道题在此已经解决,需要注意的点就是回溯,接下来继续学习吧