论学习搜索的操心事

gift_defor

md编辑器出了锅,出锅内容已删除。

搜索,计算机中最有效且思路最简单的算法。但是,对于许多菜鸡~~(例如我)~~来说,初学搜索是一件很困难的事。对与dfs来说,有两个灵魂:

首先说内置递归。

递归这东西,说难也不难,就是个递归式的问题。但对于新手来说,递归式是很难找的。有一个小技巧:

dfs(t+1);

但注意,递归后一定要写回溯,否则会无限递归

回溯也十分简单,怎么添上值的,怎么减回去,如:

a[t]=i;
book[i]=1;
ans+=i;
dfs(t+1);
book[i]=0;
ans-=i;

dfs有一个致命的缺点,就是时间很卡,那么,这个暴力的搜索就需要剪枝。

众所周知,dfs在递归的时候会产生一棵树(如搜索树、排列树之类的)。在回溯时,一些节点因为拓展了所有节点而成为死结点。但有一些字树的尝试没有任何意义。这时需要一个上界来避免“无用功”。这个上界就是剪枝函数

其实很简单,首先要确定在那种情况下是无解(或得不到当前最优解)的。根据这种情况写一个判断函数即可,如~~(乱写的)~~:

int pd_1(int i)
{
	if(i+sum[t]>=nowmax) return 0; //若容量大于最优质则返回0
	else return 1; //否则返回1
}

这就是搜索的几大要素。综上所述,用搜索骗分就会拿许多分(甚至满分)!!!

最后在写一些模板,供大家学习:

void DFS(int step,int g)
{
	if(step==g+1)
	{
		for(int i=1;i<=g;i++)
			cout<<a></a>