Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
The first line of input contains N, the number of test cases. Each test case begins with an integer 4 ≤ M ≤ 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.
For each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".
Sample Input
3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5
Output for Sample Input
yes no yes
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int n,sum;
int a[22],visited[22];
bool flag;
void DFS(int i,int l,int k){
if (k == 3){
flag = true;
return;
}
if (!visited[i]){
visited[i] = 1;
if (l + a[i] < sum / 4){
if (i > 0)
DFS(i-1,l+a[i],k);
if (flag) return;
}
if (l + a[i] == sum / 4){
DFS(n-1,0,k+1);
if (flag) return;
}
visited[i] = 0;
}
if (i > 0)
DFS(i-1,l,k);
}
int main(){
int T;
cin >> T;
while (T--){
cin >> n;
sum = 0;
for (int i = 0;i < n;i++){
cin >> a[i];
sum += a[i];
}
sort(a,a+n);
memset(visited,0,sizeof(visited));
if (sum % 4 || a[n-1] * 4 > sum){
cout << "no\n";
continue;
}
flag = false; DFS(n-1,0,0);
if (flag) cout << "yes\n";
else cout << "no\n";
}
return 0;
}