Eighty seven
Main idea: give n numbers, delete any three numbers and ask whether the remaining 10 numbers add up to 87.
q times, give three numbers at a time, indicating the number deleted.
Because Q is very large, it can be pretreated. 50*50*50
Every time you make a normal backpack, it's n*k*100
bitset optimization considered
//dp[i][j]=dp[i-1][j];
//dp[i][j]=dp[i-1][j-1][k-a[i]]
It can be seen that the current knapsack status can be transmitted by dp[i-1][j] and dp[i-1][j-1](k-a[i]==1), so it can be directly current or on it.
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<cmath> #include<bitset> #include<algorithm> #include<map> using namespace std; #define LL long long #define N 305 #define maxn 200005 #define inf 0x3f3f3f3f #define sca(x) scanf("%d",&x) #define fir first #define sec second #define mp(x,y) make_pair(x,y) #define pb(x) push_back(x) int a[55]; int b[55]; bitset<105>dp[2][15]; int mmp[55][55][55]; void init(int x,int y,int z,int n) { for(int i=0;i<12;i++) { dp[i].reset(); } dp[0][0]=1; for(int i=1;i<=n;i++) { if(i==x||i==y||i==z)continue; for(int j=10;j>=1;j--) { //dp[i][j]=dp[i-1][j]; //dp[i][j]=dp[i-1][j-1][k-a[i]] dp[j] |= (dp[j-1]<<a[i]); } } mmp[x][y][z]=mmp[x][z][y]=(int)(dp[10][87]); mmp[y][x][z]=mmp[y][z][x]=(int)(dp[10][87]); mmp[z][y][x]=mmp[z][x][y]=(int)(dp[10][87]); } int main() { int t; sca(t); while(t--) { int n; sca(n); memset(mmp,0,sizeof(mmp)); for(int i=1;i<=n;i++)sca(a[i]); int op=0; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { for(int k=j;k<=n;k++) { init(i,j,k,n); } } } int q; sca(q); while(q--) { int x,y,z; scanf("%d%d%d",&x,&y,&z); if(mmp[x][y][z])puts("Yes"); else puts("No"); } } }