题目链接 Eighty seven
背包(用bitset预处理)然后对于每个询问O(1)回答即可。
预处理的时候背包。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i(a); i <= (b); ++i) #define dec(i, a, b) for(int i(a); i >= (b); --i) const int N = 52; int T, q, n; int f[N][N][N], c[5], a[N], Q; bitset <90> A[12]; int check(int i, int j, int k){ rep(h, 0, 10) A[h].reset(); A[0][0] = 1; rep(h, 1, n) if (h != i && h != j && h != k && a[h] <= 87) dec(p, 9, 0){ A[p + 1] |= A[p] << a[h]; if (A[10][87]) return 1; } return 0; } int main(){ scanf("%d", &T); while (T--){ scanf("%d", &n); rep(i, 1, n) scanf("%d", a + i); rep(i, 1, n) rep(j, i, n) rep(k, j, n) f[i][j][k] = check(i, j, k); scanf("%d", &Q); while (Q--){ scanf("%d%d%d", c + 1, c + 2, c + 3); sort(c + 1, c + 4); puts(f[c[1]][c[2]][c[3]] ? "Yes" : "No"); } } return 0; }