如果你在最后一个点WA
查看原帖
如果你在最后一个点WA
1022282
Jefferyz楼主2024/1/24 01:18
#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[a[i]]=1;
            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让物品正常使用一次。

2024/1/24 01:18
加载中...