这道题就是给一堆数(n),然后从中删去1到3个,如果剩下的数中能选出10个加起来等于87,输出yes,否则输出No
这道题用到一个bitset优化,bitset用法可以百度下,另外这道题极度坑(注意输入输出)
假如dp[i]=1001,i个数之和为1和4的组合存在,
所以我们要求的就是dp[10][87],
1 #include<iostream> 2 #include<string.h> 3 #include<string> 4 #include<sstream> 5 #include<vector> 6 #include<deque> 7 #include<map> 8 #include<algorithm> 9 #include<iomanip> 10 #include<math.h> 11 #include<set> 12 #include<bitset> 13 using namespace std; 14 15 int maxn = 0x3f3f3f3f; 16 typedef long long ll; 17 typedef unsigned long long ull; 18 int n; 19 int in[55]; 20 bitset<90> dp[11]; 21 int flag[55][55][55]; 22 int ret(int a, int b, int c) 23 { 24 for (int i = 0; i < 11; i++) 25 dp[i].reset(); 26 dp[0][0] = 1; 27 for (int i = 1; i <= n; i++) 28 { 29 if (i != a && i != b && i != c&&in[i]<=87) 30 { 31 for (int j = 10; j >= 1; j--) 32 { 33 dp[j] |= (dp[j - 1] << in[i]); 34 } 35 if (dp[10][87]) 36 return 1; 37 } 38 } 39 return 0; 40 } 41 42 int main() 43 { 44 int t, q; 45 int a, b, c; 46 scanf("%d", &t); 47 while (t--) 48 { 49 scanf("%d", &n); 50 for (int i = 1; i <= n; i++) 51 scanf("%d", &in[i]); 52 memset(flag, 0, sizeof(flag)); 53 for (int i = 1; i <= n; i++) 54 for (int j = i; j <= n; j++) 55 for (int k = j; k <= n; k++) 56 { 57 if (ret(i, j, k)) 58 { 59 flag[i][j][k] = flag[i][k][j] = 1; 60 flag[j][i][k] = flag[j][k][i] = 1; 61 flag[k][i][j] = flag[k][j][i] = 1; 62 } 63 } 64 scanf("%d", &q); 65 while (q--) 66 { 67 scanf("%d%d%d", &a,&b,&c); 68 if (flag[a][b][c]) 69 printf("Yes\n"); 70 else 71 printf("No\n"); 72 } 73 } 74 return 0; 75 }