二维写法

typedef unsigned long long ull;
typedef long long ll;
using namespace std;
const int N = 310;
const int M = 2e5 + 10;
const int mod  = 998244353;
ll a[N],p[N],c[N],u[N],l[N];
ll dp[N][N];    //代表前i个物品,金币为j的最大战力
void solve() {
    ll n,x;
    cin>>n>>x;
    for(int i = 1 ; i <= n ; i++){
        cin>>a[i]>>p[i]>>c[i]>>u[i]>>l[i];
    }
    dp[0][0] = 0;
    for(int i = 1; i <= n ; i++){
        for(int j = 0 ; j <= x ; j++){
            dp[i][j] = dp[i - 1][j];
        }
        for(int j = 0; j <= x; j++){
            for(int k = 0 ; k <= l[i] && k * c[i] <= j - p[i] ; k++){    //k为0时,就代表没升级
                dp[i][j] = max(dp[i][j], dp[ i - 1 ][ j - p[i] - k*c[i] ] + a[i] + k*u[i]);
            }
        }
    }
    cout<<dp[n][x]<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t = 1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0 ;
}

一维写法

typedef unsigned long long ull;
typedef long long ll;
using namespace std;
const int N = 310;
const int M = 2e5 + 10;
const int mod  = 998244353;
ll a[N],p[N],c[N],u[N],l[N];
ll dp[N];      //代表金币数为i的最大战力
void solve() {
    ll n,x;
    cin>>n>>x;
    for(int i = 1 ; i <= n ; i++){
        cin>>a[i]>>p[i]>>c[i]>>u[i]>>l[i];
    }
    for(int i = 1 ; i <= n ; i++){
        for(int j = x; j >= p[i]; j--){     //倒序枚举体积
            for(int k = 0; k <= l[i] && k*c[i] <= j - p[i]; k++){
                dp[j] = max(dp[j] , dp[j - p[i] - k * c[i]] + a[i] + k * u[i]);
            }
        }
    }
    cout<<dp[x]<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t = 1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0 ;
}