#include <bits/stdc++.h>
using namespace std;
void Start() { ios::sync_with_stdio(0), cin.tie(0); }
bool endline = false;
bool endlineA = false;
template <class T>
istream& operator>>(istream& in, vector<T>& v) {
  for (auto& i : v) {
    in >> i;
  }
  return in;
}
template <class T>
ostream& operator<<(ostream& out, const vector<T>& v) {
  for (auto i : v) {
    out << i;
    if (!endline) {
      out << ' ';
    } else {
      out << '\n';
    }
  }
  if (!endline && endlineA) {
    out << '\n';
  }
  return out;
}
template <class T, class U>
istream& operator>>(istream& in, pair<T, U>& p) {
  in >> p.first >> p.second;
  return in;
}
template <class T, class U>
ostream& operator<<(ostream& out, const pair<T, U>& p) {
  out << p.first << ' ' << p.second;
  return out;
}
long long gettime() {
  return chrono::high_resolution_clock::now().time_since_epoch().count() /
         1000000;
}
mt19937_64 getrand(
    chrono::high_resolution_clock::now().time_since_epoch().count());
long long randnum(long long l, long long r) {
  return l + getrand() % (r - l + 1);
}
signed main() {
  Start();
  long long n, p, k;
  cin >> n >> p >> k;
  vector<pair<long long, vector<long long>>> s(
      n, pair<long long, vector<long long>>({0, vector<long long>(p)}));
  for (long long i = 0; i < n; i++) {
    cin >> s[i].first;
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < p; j++) {
      cin >> s[i].second[j];
    }
  }
  sort(s.rbegin(), s.rend());
  vector<vector<long long>> dp(n + 1, vector<long long>(1ll << p, -1e18));
  dp[0][0] = 0;
  for (long long i = 0; i < n; i++) {
    for (long long mask = 0; mask < (1ll << p); mask++) {
      dp[i + 1][mask] = dp[i + 1 - 1][mask];
      long long cnt = 0;
      for (long long j = 0; j < p; j++) {
        cnt += ((mask & (1ll << j)) != 0);
      }
      if (i + 1 - cnt <= k) {
        dp[i + 1][mask] = dp[i + 1 - 1][mask] + s[i].first;
      }
      for (long long j = 0; j < p; j++) {
        if ((mask & (1ll << j)) == 0) continue;
        dp[i + 1][mask] = max(
            dp[i + 1][mask], dp[i + 1 - 1][mask ^ (1ll << j)] + s[i].second[j]);
      }
    }
  }
  cout << dp.back().back();
  return 0;
}
