#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int n, T, R, d, e, C[6], P[505][6], W[6];

namespace Subtask12 {
    void solve() {
        W[0] = 1;
        for (int i = 0; i < n; i++) W[i + 1] = W[i] * (C[i] + 1);
        int S = W[n];
        vector<ll> dp(S, -1);
        dp[0] = T;
        for (int r = 0; r < R; r++) {
            for (int i = 0; i < n; i++) {
                ll gain = P[r][i] - e;
                if (gain <= 0) continue;
                for (int mask = S - 1; mask >= 0; mask--) {
                    if (dp[mask] == -1) continue;
                    int it = (mask / W[i]) % (C[i] + 1);
                    if (it > 0) {
                        int nmask = mask - W[i];
                        dp[nmask] = max(dp[nmask], dp[mask] + gain);
                    }
                }
            }
            for (int i = 0; i < n; i++) {
                ll cost = P[r][i] + d;
                for (int mask = 0; mask < S; mask++) {
                    if (dp[mask] == -1) continue;
                    int it = (mask / W[i]) % (C[i] + 1);
                    if (it < C[i] && dp[mask] >= cost) {
                        int nmask = mask + W[i];
                        dp[nmask] = max(dp[nmask], dp[mask] - cost);
                    }
                }
            }
        }
        cout << dp[0] << '\n';   
    }
}

namespace Subtask3 {
    bool check() {
        return d == 0 && e == 0;
    }
    ll ans, best;
    void dfs(int r, int i, ll cur, ll sum) {
        if (i == n) {
            best = max(best, cur + sum);
            return;
        }
        if (P[r + 1][i] <= P[r][i]) {
            dfs(r, i + 1, cur, sum);
            return;
        }
        int xmax = min(C[i], (int)(cur / P[r][i]));
        for (int x = xmax; x >= 0; x--) {
            ll cost = x * P[r][i], gain = x * P[r + 1][i];
            dfs(r, i + 1, cur - cost, sum + gain);
        }
    }
    void solve() {
        ans = T;
        for (int r = 0; r < R - 1; r++) {
            ll cost = 0, gain = 0;
            for (int i = 0; i < n; i++) 
                if (P[r + 1][i] > P[r][i]) {
                    cost += C[i] * P[r][i];
                    gain += C[i] * P[r + 1][i];
                }
            if (ans >= cost) ans = ans - cost + gain;
            else {
                best = ans;
                dfs(r, 0, ans, 0);
                ans = best;
            }
        }
        cout << ans << '\n';
    }
}

void solve() {
    cin >> n >> T >> R >> d >> e;
    for (int i = 0; i < n; i++) cin >> C[i];
    for (int r = 0; r < R; r++)
        for (int i = 0; i < n; i++)
            cin >> P[r][i];
    if (Subtask3::check()) Subtask3::solve();
    else Subtask12::solve();
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    #define TASK "BUSGAME"
    if (fopen(TASK".INP", "r")) {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }

    int tests = 1; // cin >> tests;
    while (tests--) solve();

    #ifdef LOCAL
    cerr << "\nTime elapsed: " << clock() << " ms.\n";
    #endif
    return 0;
}