终于调出来了,18ms
粘个题解>>http://codevs.cn/problem/1268/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int w,d,v,num[50],a,b = 0;
bool ok = 0;
void dfs(int s,int c)
{
if(ok) return;
if(pow(b,w - c + 1) < s) return;// 最优化剪枝
if(s < 0) return;//可行性剪枝
if(c == w) {if(s == 0)ok = 1;return;}//只能使用w - 1个符号
for(int i = d;i >= 1;i --)
{
dfs(s - num[i],c + 1);//由于+和*不方便剪枝,采取 - 和 / 的方式
if(num[i]&&s >= num[i]&&s % num[i] == 0)
dfs(s / num[i],c + 1);
}
}
int main()
{
scanf("%d%d",&w,&d);
for(int i = 1;i <= d;i ++)
scanf("%d",&num[i]),b = max(b,num[i]);
scanf("%d",&v);
for(int i = 1;i <= v;i ++)
{
ok = 0;
scanf("%d",&a);
if(pow(b,w + 1) < a);//若最大值全使用乘法也得不到解说明不可能有解
else
dfs(a,-1);//使用的数字比运算个数多一个。
if(ok) puts("Y");
else puts("N");
}
}