我把他当做分组背包来做
#include<bits/stdc++.h>
using namespace std;
struct node{
long long w,c;
}a[20000009];
long long f[20000009],n,m,v1[20000009],v2[500][110],p[20000009];
bool cmp(node d1,node d2){
return d1.w<d2.w;
}
int main(){
cin>>n>>m;
int o=1;
for(int i=1;i<=n;i++){
cin>>a[i].w>>a[i].c;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(a[j].w-a[i].w>3){
p[i]=o;
p[j]=o;
o++;
}
else{
p[i]=o;
o++;
p[j]=o;
}
}
}
for(int i=1;i<=n;i++){
v1[p[i]]++;
v2[p[i]][v1[p[i]]]=i;
}
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
int e=v2[p[i]][v1[p[i]]];
if(j>=a[e].w){
f[j]=max(f[j],f[j-a[e].w]+a[e].c);
}
}
}
cout<<f[m];
return 0;
}