题目
做这个题完全没有想到dp
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
#define mem(a,b) memset(a,b,sizeof(a))
const int Max=2e6+10;
int dp[Max],a[55];
int main()
{
int k,n;
while(~scanf("%d%d",&k,&n))
{
mem(dp,INF);
mem(a,0);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
sort(a,a+n);
dp[0]=0;
for(int i=0; i<n; i++)
{
for(int j=a[i]; j<=k*10000; j++) //k*10000是题中可能出现的最大面值,遍历所有可能出现的面值
{
if(dp[j]>dp[j-a[i]]+1)//dp里存用来几张邮票,j-a[i]指如果要这张邮票,最少要几张邮票
dp[j]=dp[j-a[i]]+1;
}
}
for(int i=1; i<=k*10000; i++)
if(dp[i]>k)
{
printf("%d\n",i-1);
break;
}
}
return 0;
}