我先采用了智障解法(n * n枚举...刚开始把n看成1000了还以为能过)
理所当然的t了,不过我怀疑优化一下能过?(感觉数据不太行的亚子
然后就是O(n * k * k)的解法,看到好多人快乐二分,其实完全用不到,建一个10000000的数组就ok了(我刚开始还以为会MLE
不过有几个地方要注意一下
1.要判断是不是在范围内,不然会出现查询的时候越界,快乐re的情况
2.要判断是不是>0,同理,而且负数取模会有你意想不到的结果
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = ;
int a[N];
bool map[];
int main() {
int n, K;
scanf("%d %d", &n, &K);
for (int i = ; i < n; i++)
scanf("%d", &a[i]), map[a[i]] = true;
int q;
scanf("%d", &q);
while (q--) {
int s;
scanf("%d", &s);
int ans = K + ;
for (int i = ; i < n; i++)
for (int j = ; j <= K; j++)
for (int k = ; k <= (K - j); k++) {
if ((s - j * a[i]) % k != || s <= j * a[i])
continue;
if ((s - j * a[i]) / k > a[n - ])
continue;
if (map[(s - j * a[i]) / k])
ans = min(ans, j + k);
}
if (ans <= K)
printf("%d\n", ans);
else
puts("-1");
}
return ;
}