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