摘要:DFS, 和1151查不多,注意剪枝。
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
const int size = 20;
int input[size];
bool used[size];
bool found = false;
int M = 0;
int sum = 0;
void DFS(int start, int value, int num)
{
if( found ){
return;
}
if( value>0 && start>=M){
return;
}
if( value==0 && start<=M ){
/*
for(int i=1; i<num; i++){
cout << "/t";
}
cout << "num:" << num << endl;
for(int i=1; i<num; i++){
cout << "/t";
}
copy(used, used+M, ostream_iterator<int>(cout, " "));
cout << endl;
*/
if( num >= 4 ){
found = true;
return;
}
int i = 0;
for(; i<M; i++){
if( !used[i] ){
break;
}
}
used[i] = true;
DFS(i+1, sum/4-input[i], num+1);
used[i] = false;
return;
}
if( input[start]>value || used[start] ){
DFS(start+1, value, num);
return;
}
if( input[start]==input[start-1] && !used[start-1] ){
DFS(start+1, value, num);
return;
}
used[start] = true;
DFS(start+1, value-input[start], num);
if( found ){
return;
}
used[start] = false;
DFS(start+1, value, num);
}
int main()
{
int n;
cin >> n;
for(int i=1; i<=n; i++){
cin >> M;
sum = 0;
int max_value = 0;
for(int j=0; j<M; j++){
cin >> input[j];
used[j] = false;
sum += input[j];
max_value = max_value>=input[j]?max_value:input[j];
}
if( sum % 4 || max_value>sum/4){
cout << "no" << endl;
continue;
}
found = false;
sort(input, input+M, greater<int>());
//copy(input, input+M, ostream_iterator<int>(cout, " "));
//cout << endl;
used[0] = true;
DFS(1, sum/4-input[0], 1);
if( found ){
cout << "yes" << endl;
}else{
cout << "no" << endl;
}
}
return 0;
}