给定n个棍子,问能否构成一个正方形,全部用完。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
new POJ2362().solve();
}
}
class POJ2362{
InputReader in = new InputReader(System.in) ;
PrintWriter out = new PrintWriter(System.out) ;
final int N = 28 ;
int[] val = new int[N] ;
boolean[] vis = new boolean[N] ;
int toLen , n ;
boolean dfs(int pos , int nowlen , int count){
if(count == 3) return true ;
for(int i = pos ; i >= 0 ; i--){
if(! vis[i]){
vis[i] = true ;
if(nowlen + val[i] < toLen){
if(dfs(i-1 , nowlen+val[i] , count)) return true ;
}
else if(nowlen + val[i] == toLen){
if(dfs(n-1 , 0 , count+1)) return true ;
}
vis[i] = false ;
}
}
return false ;
}
void solve() {
int t = in.nextInt() ;
while(t-- > 0){
n = in.nextInt() ;
int sum = 0 ;
for(int i = 0 ; i < n ; i++){
sum += val[i] = in.nextInt() ;
}
toLen = sum / 4 ;
Arrays.sort(val , 0 , n) ;
if(toLen * 4 != sum || n < 4 || val[n-1] > toLen){
out.println("no") ;
continue ;
}
Arrays.fill(vis , false) ;
if(dfs(n-1 , 0 , 0)) out.println("yes") ;
else out.println("no") ;
}
out.flush();
}
}
class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = new StringTokenizer("");
}
private void eat(String s) {
tokenizer = new StringTokenizer(s);
}
public String nextLine() {
try {
return reader.readLine();
} catch (Exception e) {
return null;
}
}
public boolean hasNext() {
while (!tokenizer.hasMoreTokens()) {
String s = nextLine();
if (s == null)
return false;
eat(s);
}
return true;
}
public String next() {
hasNext();
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
public BigInteger nextBigInteger() {
return new BigInteger(next());
}
}