1 //C++深度优先搜索(递归树模拟) 2 #define _CRT_SECURE_NO_WARNINGS 3 #include <iostream> 4 #define MAX_N 1000 5 using namespace std; 6 int a[MAX_N]; 7 int n,k; 8 9 //已经从前i项得到了和sum,然后对于i项之后的进行分支 10 bool dfs(int i,int sum) 11 { 12 //如果前n项都计算过了 ,则返回sum是否与k相等 13 if(i==n) 14 { 15 return sum==k; 16 } 17 18 //不加上a[i]的情况的分支 19 if(dfs(i+1,sum)) 20 { 21 return true; 22 } 23 //加上a[i]的情况的分支 24 //if(dfs(i+1,sum+a[i+1])) 25 if(dfs(i+1,sum+a[i])) 26 { 27 return true; 28 } 29 30 //无论是否加上a[i]都不能凑成k就返回false 31 return false; 32 } 33 void solve() 34 { 35 //if(dfs(1,0)) 36 if(dfs(0,0)) 37 { 38 cout<<"Yes"<<endl; 39 } 40 else 41 { 42 cout<<"No"<<endl; 43 } 44 } 45 int main(void) 46 { 47 cin>>n; 48 int i,temp; 49 //for(i=1;i<=n;i++) 50 for(i=0;i<n;i++) 51 { 52 cin>>temp; 53 a[i]=temp; 54 } 55 cin>>k; 56 57 solve(); 58 59 return 0; 60 }
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;