POJ 2362
1 #include <iostream> 2 #define MAXN 30 3 using namespace std; 4 5 int _m[MAXN]; 6 7 bool mark[MAXN]; 8 9 bool boo; 10 11 int st; 12 13 int num; 14 void DFS(int time,int sum,int k); 15 int main() 16 { 17 //freopen("acm.acm","r",stdin); 18 int test; 19 int ave; 20 int i; 21 int sum; 22 cin>>test; 23 while(test --) 24 { 25 cin>>num; 26 sum = 0; 27 boo = false; 28 memset(mark,false,sizeof(mark)); 29 for(i = 0; i < num; ++ i) 30 { 31 cin>>_m[i]; 32 sum += _m[i]; 33 } 34 35 if(sum % 4 != 0) 36 { 37 cout<<"no"<<endl; 38 continue; 39 } 40 else 41 { 42 st = sum/4; 43 } 44 45 DFS(0,0,0); 46 47 if(boo) 48 { 49 cout<<"yes"<<endl; 50 } 51 else 52 { 53 cout<<"no"<<endl; 54 } 55 56 } 57 58 } 59 60 void DFS(int time,int sum,int k) 61 { 62 if(time == num) 63 { 64 return; 65 } 66 if(sum > st) 67 { 68 return; 69 } 70 if(sum == st) 71 { 72 if(k + 1 == 3) 73 { 74 boo = true; 75 return; 76 } 77 else 78 { 79 DFS(0,0,k+1); 80 } 81 82 return; 83 } 84 if(!mark[time]) 85 { 86 mark[time] = true; 87 DFS(time+1,sum + _m[time],k); 88 if(boo) 89 { 90 return; 91 } 92 mark[time] = false; 93 } 94 DFS(time + 1,sum,k); 95 }