//暴力深搜#include<iostream>#include<vector>usingnamespacestd;intgetCnt(int m, vector<int>& stamps,int index,int cnt){if(m ==0)return cnt;int ans =20;//下一张邮票可能取 index ~ 0 中的某一张for(int i = index; i >=0; i --){if(m == stamps[i]) ans =min(ans, cnt +1);//如果邮票面额大于要凑齐的总值,自然不需要去选if(m > stamps[i]){int newCnt =getCnt(m - stamps[i], stamps, i -1, cnt +1);if(newCnt !=0){
ans =min(ans, newCnt);}}}return ans ==20?0: ans;}intmain(){int m, n;while(cin >> m >> n){vector<int>stamps(n);for(int i =0; i < n; i ++)
cin >> stamps[i];
cout <<getCnt(m, stamps, n -1,0)<< endl;}}
//动态规划#include<iostream>#include<algorithm>#include<vector>usingnamespace std;constint MAX =100000;intmain(){int m, n;while(cin >> m >> n){
vector<int>stamps(n +1,0);
vector<vector<int>>dp(n +1,vector<int>(m +1, MAX));for(int i =1; i <= n; i ++)
cin >> stamps[i];
dp[0][0]=0;for(int i =1; i <= n; i ++){for(int j =0; j <= m; j ++){if(j < stamps[i]){
dp[i][j]= dp[i -1][j];continue;}else{
dp[i][j]=min(dp[i -1][j], dp[i -1][j - stamps[i]]+1);}}}if(dp[n][m]== MAX)
cout <<0<< endl;else
cout << dp[n][m]<< endl;}return0;}