求助RE
查看原帖
求助RE
428449
Amon_Xolotl楼主2023/11/3 20:45
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
  int x=0,f=1;
  char ch=getchar();
  while(ch>'9'||ch<'0'){
    if(ch=='-'){
      f=-f;
    }
    ch=getchar();
  }
  while(ch>='0'&&ch<='9'){
    x=x*10+ch-'0';
    ch=getchar();
  }
  return x*f;
}
int T,n,m;
struct zjy{
  int w,v;
}s[105];
vector<int> G[55],Q[55];
int t,tot,num;
ll f[55][5010],g[55][5010],ans;
int main(){
  while(1){
    ans=0;
    memset(f,0,sizeof(f));
    memset(g,0,sizeof(g));
    for(int i=0;i<=50;++i){
      G[i].clear(),Q[i].clear();
    }
    n=read(),m=read();
    if(n==-1&&m==-1){
      break;
    }
    for(int i=1;i<=n;++i){
      s[i].v=read(),s[i].w=read();
      t=s[i].v,tot=0;
      while(((t>>tot)&1)==0){
        ++tot;
      }
      G[tot].push_back((t>>tot));
      Q[tot].push_back(s[i].w);
    }
    num=0;
    while((m>>num)){
      ++num;
    }
    for(int i=0;i<=num;++i){
      for(int j=0;j<G[i].size();++j){
        for(int k=500;k>=G[i][j];--k){
          f[i][k]=max(f[i][k],f[i][k-G[i][j]]+Q[i][j]);
        }
      }
    }
    for(int i=0;i<=num;++i){
      for(int j=500;j>=0;--j){
        for(int k=0;k<=j;++k){
          g[i][j]=max(g[i][j],g[i-1][k*2+((m>>(i-1))&1)]+f[i][j-k]);
        }
        //ans=max(ans,g[i][j]);
      }
    }
    printf("%lld\n",g[num-1][1]);
  }
  
  
  return 0;
}
2023/11/3 20:45
加载中...