#include <iostream>
#include <limits>
using namespace std;
int main()
{
int m,n;
int a[21];
int dp[101];
int i,j;
while(cin>>m>>n)
{
dp[0] = 0;
for(i=1; i<=m; ++i)
{
dp[i] = numeric_limits<int>::max();
}
for(i=1; i<=n; ++i)
{
cin>>a[i];
}
for(i=1; i<=n; ++i)
{
for(j=m; j>=a[i]; j--)
{
if(dp[j-a[i]]!=numeric_limits<int>::max() && dp[j]>dp[j-a[i]]+1)
{
dp[j] = dp[j-a[i]] + 1;
}
}
}
if(dp[m] == numeric_limits<int>::max())
cout<<0<<endl;
else
cout<<dp[m]<<endl;
}
return 0;
}
正好装满的0-1背包问题。。。在dp数组上初始化是很有技巧的……