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 }