深度优先搜索之偏爱时间复杂度

题目要求给你一些数字 , 其中的一些数字相加能不能等于已经给定的数字 sum ? 对这个问题我写了一个程序 , 然而总是超时 , 无药可救但是 看了别人的 程序 , 人家的程序运行得效率特别高 , 然后分析了一下 , 颇有感想决定记录下来        给出一组数据 例如  1  2  4  7    给定总和为 13   问在这几个数字中有没有几个数字的和 等于 所给数字 13的  然后我就没耽误事 开始暴力搜索了 ...    下面附上代码和分析

 1 void DFS(int n,int sum)
 2 {
 3     for(int i=0;i<n;i++)
 4     {
 5         if(mark)
 6             return ;
 7         if(!visited[i])   //  如果该数字 没有被使用过的话
 8         {
 9             visited[i]=1;
10             maxn=maxn+a[i];
11             if(maxn==sum)
12             {
13                 mark=1;
14                 break;
15             }
16             DFS(n,sum);
17             maxn=maxn-a[i];
18             visited[i]=0;
19         }
20     }
21 }

 

 

 

 

 

 

我的代码 时间复杂度极高  将所有的可能性都列出来 并且还是 , 当顺序不一样其中元素一样的时候 我也列了出来  . . . . . . 我知道你和我同样的无语 , 这样的时间复杂度真是高的可怕 .  以前的时候 自己太懒   学了 对于图的搜索之后 就开始按照同样的套路开始对  数列进行 搜索 , 一直都会有超时情况的出现  ,  但是一直都是  新三年旧三年缝缝补补又三年 .....   今天就好好的总结一下经验教训  解决了这个问题   . . .      

 下面附上 , 一个学姐写的代码 

 1 bool DFS(int i,int m)
 2 {
 3     if(i==n)
 4         return sum==m;
 5     else
 6         if(sum<m)
 7         return false;
 8     if(DFS(i+1,m))
 9         return true;
10     if(DFS(i+1,a[i]+m))
11         return true;
12     return false;
13 }

 

 

 

学姐的代码 , 虽然也是将所有的情况都列出来 ( 不可能的时候有剪枝 ) , 但是学姐的代码 顺序不一样但是元素一样 的情况是没有出现的 .    这样就高效的很       

 

posted @ 2016-04-05 15:02  X-POWER  阅读(3637)  评论(0编辑  收藏  举报