E 转移方程氧气gg已经讲过啦,这里 f 数组的第一维是选到第几个,第二维是当前花费了多少钱,第三维是这位(第一维)有没有选择,cnt 的含义是有几个魔法宝石, sum的含义是该魔法宝石之前的普通宝石的价值之和
int f[MAXN][MAXN][2],w[MAXN],sum[MAXN];
void solve() {
int n,k;cin>>n>>k;
int tmp=0;cnt=0;
for(int i=1;i<=n;i++){
int op;int x;cin>>op>>x;
if(op==1){
tmp+=x;
}else{
w[++cnt]=x;
sum[cnt]=tmp;
}
}
for(int i=0;i<=cnt;i++)
for(int j=0;j<=k;j++)
f[i][j][0]=f[i][j][1]=-1e18;
ll ans=0;
f[0][0][0]=0;
for(int i=1;i<=cnt;i++){
for(int j=0;j<=k;j++){
f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]);
if(i>=2&&j>=w[i]+w[i-1]){
f[i][j][1]=max( f[i-2][j-w[i]-w[i-1]][0]+sum[i]-sum[i-1],
f[i-2][j-w[i]-w[i-1]][1]+sum[i]-sum[i-2]);
}
ans=max({ans,f[i][j][0],f[i][j][1]});
}
}
cout<<ans<<endl;
}
自认为是很清楚的代码吖