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;
}

自认为是很清楚的代码吖