题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5890
思路:因为n只有50,所以可以预处理出答案,直接背包会TLE,所以用bitset优化。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <bitset>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%I64d",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod int(1e9+7)
#define lc (d<<1)
#define rc (d<<1|1)
#define P pair<int,int>
#define pi acos(-1)
int a[58],d[58][58][58],n;
bitset<88>bs[11];
int as(int i,int j,int k)
{
FOR(x,0,10) bs[x].reset();
bs[0][0]=1;
FOR(x,1,n)
{
if(x!=i&&x!=j&&x!=k&&a[x]<=87)
{
FOL(y,9,0) bs[y+1]|=bs[y]<<a[x];
}
if(bs[10][87]) return 1;
}
return 0;
}
int main()
{
cin.tie(0);
int t;
si(t);
while(t--)
{
si(n);
FOR(i,1,n) si(a[i]);
FOR(i,1,n)
{
FOR(j,i,n)
{
FOR(k,j,n)
{
d[i][j][k]=d[i][k][j]=d[j][i][k]=d[j][k][i]=d[k][i][j]=d[k][j][i]=as(i,j,k);
}
}
}
int q,x,y,z;
si(q);
while(q--)
{
si(x),si(y),si(z);
if(d[x][y][z]) puts("Yes");
else puts("No");
}
}
return 0;
}