// UVa 10364 - Square #include <iostream> #include <string.h> using namespace std; int n, a[20], pos[3][1048577], m; void comb(int k, int mask, int sum) { if (sum >= m || k == n) { if (sum == m) pos[1][++pos[1][0]] = mask; return; } comb(k + 1, mask, sum); comb(k + 1, mask | (1 << k), sum + a[k]); } int main() { int t; for (cin >> t; t; t--) { cin >> n; m = 0; for (int i = 0; i < n; i++) { cin >> a[i]; m += a[i]; } bool sol = false; if (m % 4 == 0) { m /= 4; pos[1][0] = 0; comb(0, 0, 0); bool yet[1048576]; memset(yet, true, sizeof(yet)); // generate 2nd level pos[2][0] = 0; for (int i = 1; i < pos[1][0]; i++) for (int j = i + 1; j <= pos[1][0]; j++) if ((pos[1][i] & pos[1][j]) == 0 && yet[pos[1][i] | pos[1][j]]) { pos[2][++pos[2][0]] = pos[1][i] | pos[1][j]; yet[pos[2][pos[2][0]]] = false; } // generate 3rd level for (int i = 1; i < pos[1][0] && !sol; i++) for (int j = 1; j <= pos[2][0]; j++) if ((pos[1][i] & pos[2][j]) == 0 && yet[pos[1][i] | pos[2][j]]) { int now = pos[1][i] | pos[2][j]; yet[now] = false; sol = true; break; } } // output if (sol) cout << "yes" << endl; else cout << "no" << endl; } return 0; }
Tuesday, July 21, 2015
UVa 10364 - Square
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment