#include <iostream>
#include <vector>
using namespace std;
vector<int> v;
int main() {
int sum;
while (cin >> sum) {
int N, data;
cin >> N;
int num = N;
//dp[i]表示要凑i最少需要几张邮票
vector<int> dp(100, 100);
dp[0] = 0;//初始化,0元需要0张
while (num--) {
cin >> data;
v.push_back(data);
// dp[data] = 1;(这儿不能这样初始化,会导致有些邮票被重复用)
}
//先遍历物品,再遍历背包
//物品是正序的只有一遍遍历,比如要得到3,结果1,2选择完了,不可能再出现2,1
//属于【组合问题】
//先遍历背包,再遍历物品
//物品会有多次遍历,比如要得到3,结果1,2选择完了还可能会出现2,1的情况
//属于【排列问题】
//此题应属于组合问题
for (int j = 0; j < N; j++) {//先遍历物品,就是邮票面值
for (int i=sum;i>=0;i--)//后遍历背包,也就是要凑的邮票总值
if (i >= v[j]) {
//dp[i]是不选择v[j]面值的邮票后最少需要的邮票数目
//dp[i - v[j]] + 1是选择v[j]面值的邮票后最少需要的邮票数目,选择了所以加1,同时要凑的目标小了所以是i - v[j]
dp[i] = min(dp[i], dp[i - v[j]] + 1);
}
}
//for(int i=0;i<=sum;i++) cout<<dp[i]<<" ";
//如果没有被更新,依旧是100的初值,说明无解
if (dp[sum] == 100) {
cout << "0";
} else cout << dp[sum] << endl;
}
}