题目链接:http://codeforces.com/contest/789/problem/E
题意:给你一个数n,一个数k,再给k个数字,每个数字可以选择任意个数,最后问你最少使用“几个次”数字使得平均数为n。(0 ≤ n ≤ 1000, 1 ≤ k ≤ 1e6) ,(0 ≤ ai ≤ 1000)
解法:先统一一下度量,这k个数字ai,对最后结果的贡献应该是ai-n吧,所以先这么处理一下。然后bfs就行了。因为最多只有-1000到1000的范围,而k个数字实际上,只有最多有1000种。所以大概是1k*2k的样子,然后就可以放手BFS了。
//CF 789E
#include <bits/stdc++.h>
using namespace std;
int n, k;
int d[2010];
set <int> s;
queue <int> q;
int work()
{
while(!q.empty())
{
int v = q.front(); q.pop();
if(v == 0) return d[v + 1000];
for(auto it : s){
int nxtv = it + v;
if(nxtv >= -1000 && nxtv <= 1000 && d[nxtv + 1000] == 0){
q.push(nxtv);
d[nxtv+1000] += d[v + 1000] + 1;
}
}
}
return -1;
}
int main()
{
scanf("%d%d", &n, &k);
for(int i = 0; i < k; i++){
int x;
scanf("%d", &x);
x -= n;
s.insert(x);
q.push(x);
d[x+1000] = 1;
}
printf("%d\n", work());
return 0;
}