#include "iostream"
#include "algorithm"
#include "cstring"
using namespace std;
int dp[50][50];
int a[50];
int solve( int i, int target ,int n);
int main(){
int n;
int k;
int count;
int tget;
memset(dp,-1,sizeof(dp));
while(scanf("%d",&n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
scanf("%d",&count);
for(int i = 0; i < count; i++){
scanf("%d",&tget);
if(solve(0,tget,n))
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
int solve( int i, int target ,int n){
if (target == 0) return 1;
if (target < 0) return 0;
if (i >= n) return 0;
if (dp[i][target] != -1) return dp[i][target];
int res = solve(i + 1,target,n) || solve (i + 1,target - a[i],n);
dp[i][target] = res;
return res;
}
剪枝版的递归。