#include<iostream>
#include<cstring>
using namespace std;
const int N = 110;
const int M = 1e4 + 5;
int f[N][M]; //前i个石子能否称出j的重量(1:可以, 0:不可以)
int n, t;
int w[N];
int main()
{
while(cin >> n)
{
for(int i = 1; i <= n; i++) cin >> w[i];
memset(f, 0, sizeof f);
f[0][0] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= M; j++) //最多能称1e4重量(或者可对w[i]求一个前缀和)
{
if(f[i-1][j])
{
f[i][j] = 1; //不选择第i个石子
f[i][j+w[i]] = 1; //选择第i个石子放在右侧进行叠加
f[i][abs(j-w[i])] = 1; //选择第i个石子放在左侧进行抵消
}
}
}
cin >> t;
while(t --)
{
int x;
cin >> x;
if(x > 1e4 || !f[n][x]) cout << "NO" << endl;
else cout << "YES" << endl;
}
}
return 0;
}
原文:https://www.cnblogs.com/K2MnO4/p/14678726.html