题解 | #小苯的01背包(easy)#

小苯的01背包(easy)

https://www.nowcoder.com/practice/32407155397c443a95f895f11942f02f

从大到小试答案,某一位能找到一种选法同时满足价值不掉到这位以下且体积不超k就留,不行就删,最后剩下的就是最优值。

void solve(){
    int n,k;cin>>n>>k;
    vi v(n),w(n);
    for(int i=0;i<n;++i){
        cin>>v[i]>>w[i];
    }
    auto ck=[&](int x)->bool{
        vi f(2048,0),g;
        for(int i=0;i<n;++i){
            if((w[i]&x)!=x)continue;
            g=f;
            g[v[i]]=1;
            for(int j=0;j<2048;++j){
                if(f[j])g[j&v[i]]=1;
            }
            f.swap(g);
        }
        for(int i=0;i<=k;++i){
            if(f[i])return 1;
        }
        return 0;
    };
    int ans=0;
    for(int i=10;i>=0;--i){
        int x=ans|(1<<i);
        if(ck(x))ans=x;
    }
    cout<<ans<<endl;
}
全部评论

相关推荐

04-24 18:13
南京大学 Java
不吃酸菜血肠:看力竭了
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务