深度优先搜索之偏爱时间复杂度
题目要求给你一些数字 , 其中的一些数字相加能不能等于已经给定的数字 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 }
学姐的代码 , 虽然也是将所有的情况都列出来 ( 不可能的时候有剪枝 ) , 但是学姐的代码 顺序不一样但是元素一样 的情况是没有出现的 . 这样就高效的很