,.,abs(jx).{对于这题来说,难点在于分析左右两边的天平.但是我们可以发现,把这个石头放负数边其实就是abs(j-x).} :f[i][j]ij.{对此我们令:f[i][j]为到了第i个能否组成j.} :{三个转移方程:} f[i][j]+=f[i1][j];{f[i][j]+=f[i-1][j];} f[i][j+x]+=f[i1][j];{f[i][j+x]+=f[i-1][j];} f[i][abs(jx)]+=f[i1][j];{f[i][abs(j-x)]+=f[i-1][j];} 代码如下:

#include <bits stdc++.h>
using namespace std;
const int M=105,N=1e4+50;
bool f[M][N];
int main()
{
	int n;
	while(scanf("%d",&amp;n)!=EOF)
	{
		int m=10000;
		for(int i=0;i&lt;=n;i++)	f[i][0]=true;
		for(int i=1;i&lt;=n;i++)
		{
			int x;scanf("%d",&amp;x);
			for(int j=0;j&lt;=m;j++)
			{
				if(f[i-1][j])
				{
					f[i][j]=true;
					f[i][j+x]=true;
					f[i][abs(j-x)]=true;
				}
			}
		}int q;scanf("%d",&amp;q);
		while(q--)
		{
			int x;scanf("%d",&amp;x);
			if(x&gt;m||!f[n][x])	puts("NO");
			else				puts("YES");
		}
		memset(f,false,sizeof f);
	}
}
```</bits>