提供一种新做法,理论复杂度更快,我们用bitset加速维护
发现一共只有三种可能,放左边放右边和不放
我们初始设定一个sum以防负数,然后左右移位就可以了
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define DB double
#define M 20200
int n,a[M],Q;
bitset<M>B,tmp;
int main(){
while(scanf("%d",&n)!=EOF){
int all=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]),all+=a[i];
B.reset(),B[all]=true;
for(int i=1;i<=n;i++) tmp=B,B|=(B<<a[i]),B|=(B>>a[i]);
scanf("%d",&Q);
while(Q--){
int x; scanf("%d",&x);
if(x>all) puts("NO");
else puts((B[all+x]||B[all-x])?"YES":"NO");
}
}return 0;
}

京公网安备 11010502036488号