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

京公网安备 11010502036488号