#include <bits/stdc++.h>
using namespace std;
inline int read(){
char c;
bool flag=false;
while((c=getchar())<'0'||c>'9') if(c=='-') flag=true;
int res=c-'0';
while((c=getchar())>='0'&&c<='9') res=(res<<3)+(res<<1)+c-'0';
return flag? -res:res;
}
int a[5001],f[50001];
int main(){
int H=read(),N=read(),ans=-0x3f3f3f;
f[0]=1;
for(int i=1;i<=N;++i) a[i]=read();
for(int i=1;i<=N;++i){
for(int j=H;j>=a[i];--j){
f[j]|=f[j-a[i]];
if(f[j]) ans=max(ans,j);
}
}
cout<<ans;
return 0;
}
你的代码大概率使用了被注释了的那种写法,但是当数据为
2 1
1
你假定了1在使用前已经可行,那么后续判断可行情况时,会用到重复的1.所以你需要把f[0]设为1让物品正常使用一次。