搜索,计算机中最有效且思路最简单的算法。但是,对于许多菜鸡~~(例如我)~~来说,初学搜索是一件很困难的事。对与dfs
来说,有两个灵魂:
内置递归
内置模拟(即for
循环以及if
等等)
首先说内置递归。
递归这东西,说难也不难,就是个递归式的问题。但对于新手来说,递归式是很难找的。有一个小技巧:
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>