从大到小试答案,某一位能找到一种选法同时满足价值不掉到这位以下且体积不超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;
}