m大题面 https://www.malic.xyz/archives/3117/4
牛客网题面 https://ac.nowcoder.com/acm/problem/13586
其实和2021蓝桥杯的G题一样,也和牛客上的一个题几乎一样,我都傻了,当时如果提前研究明白,我直接跑到前几名去了。
吐槽一下蓝桥杯,就这出题水平??直接搬过来原题,还好意思收300???
主要就是01背包思想,对于每个询问O(1)回答就好。
但是对于机试来说,感觉数据范围有点大啊,不知道能不能过。。。注意一下偏移量这种小技巧。。
#include <bits/stdc++.h>
#define IO \
ios::sync_with_stdio(false);
// cout.tie(0);
using namespace std;
typedef long long LL;
const int maxn = 2e6 + 10;
const int inf = 0x3f3f3f3f;
int dis[4][2] = {1, 0, 0, 1, 0, -1, -1, 0};
int w[200];
bool f[200][maxn];
bool dp[maxn];
int B = maxn / 2;
int main()
{
#ifdef WXY
freopen("in.txt", "r", stdin);
#endif
IO;
int T, n, q;
cin >> T;
while (T--)
{
cin >> n;
int sum = 0;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
sum = sum + w[i];
}
for (int i = B; i <= B + sum; i++)
dp[i] = false;
f[0][B] = true;
for (int i = 1; i <= n; i++)
{
for (int j = -sum; j <= sum; j++)
{
f[i][j + B] = f[i - 1][j + B];
if (j - w[i] >= -sum)
f[i][j + B] |= f[i - 1][j - w[i] + B];
if (j + w[i] <= sum)
f[i][j + B] |= f[i - 1][j + w[i] + B];
if (f[i][j + B])
dp[j + B] = true;
}
}
cin >> q;
int x;
for (int i = 0; i < q; i++)
{
cin >> x;
if (dp[x + B] == false || x > sum)
cout << "0";
else
cout << "1";
}
cout << "\n";
}
return 0;
}