#include<bits/stdc++.h>
using namespace std;
int v[5000+10],f[50000+10];
int main()
{
int c,h;
scanf("%d%d",&c,&h);
for(int i=1;i<=h;i++)scanf("%d",&v[i]);
for(int i=1;i<=h;i++){
for(int j=c;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+v[i]);
if(f[c]==c){
printf("%d",c);
return 0;
}
}
}
printf("%d",c);
return 0;
}
典型的01背包,但是有2个点一直不过,所以把cin换成了scanf,过了一个点,还是有一个一直不过。
最后发现是f数组开太小了,晕,因为f是以c作下标,所以得开c那么大,改掉之后就可以了。