#include <bits/stdc++.h>
namespace fastIO {
static const int IN_BUF = 1 << 23, OUT_BUF = 1 << 23;
char buf[IN_BUF], *ps = buf, *pt = buf;
inline char my_getchar() {
  return ps == pt && (pt = (ps = buf) + fread(buf, 1, IN_BUF, stdin), ps == pt)
             ? EOF
             : *ps++;
}
template <typename T>
inline bool read(T &x) {
  char op = 0, ch = my_getchar();
  for (x = 0; !isdigit(ch) && ch != EOF; ch = my_getchar())
    if (ch == '-') op ^= 1;
  if (ch == EOF) return false;
  for (; isdigit(ch); ch = my_getchar()) x = x * 10 + (ch ^ '0');
  if (ch != '.')
    return op ? x = -x : 0, true;
  else
    ch = my_getchar();
  T t = 1;
  for (; isdigit(ch); ch = my_getchar()) t /= 10, x += (ch ^ '0') * t;
  return op ? x = -x : 0, true;
}
inline int reads(char *s) {
  int n = 0;
  char ch = my_getchar();
  for (; isspace(ch) && ch != EOF; ch = my_getchar())
    ;
  for (; !isspace(ch) && ch != EOF; ch = my_getchar()) s[n++] = ch;
  return s[n] = '\0', n;
}
char pbuf[OUT_BUF], *pp = pbuf;
struct _flusher {
  ~_flusher() { fwrite(pbuf, 1, pp - pbuf, stdout); }
} OutputFlusher;
inline void my_putchar(char x) {
  pp == pbuf + OUT_BUF ? fwrite(pbuf, 1, OUT_BUF, stdout), pp = pbuf : 0,
                                                           *pp++ = x;
}
template <typename T>
inline void print_(T x) {
  if (x == 0) return my_putchar('0'), void(0);
  std::vector<int> num;
  for (x < 0 ? my_putchar('-'), x = -x : 0; x; x /= 10) num.push_back(x % 10);
  while (!num.empty()) my_putchar(num.back() ^ '0'), num.pop_back();
}
template <typename T>
inline void print(T x, char ch = '\n') {
  print_(x), my_putchar(ch);
}
inline void prints_(const char *s, int n = -1) {
  if (n == -1) n = strlen(s);
  for (register int i = 0; i < n; ++i) my_putchar(s[i]);
}
inline void prints(const char *s, int n = -1, char ch = '\n') {
  prints_(s, n), my_putchar(ch);
}
template <typename T>
inline void printd_(T x, int n) {
  if (x < 0) x = -x, my_putchar('-');
  long long a, b;
  for (register int i = 0; i < n; ++i) x *= 10;
  x = (long long)(x + 0.5);
  for (register int i = 0; i < n; ++i) x /= 10;
  a = x, x -= a;
  for (register int i = 0; i < n; ++i) x *= 10;
  b = x;
  print_(a);
  if (n)
    my_putchar('.');
  else
    return;
  std::vector<int> num(n);
  for (register int i = 0; i < n; ++i) num[i] = b % 10, b /= 10;
  while (!num.empty()) my_putchar(num.back() ^ '0'), num.pop_back();
}
template <typename T>
inline void printd(T x, int n, char ch = '\n') {
  printd_(x, n), my_putchar(ch);
}
}  // namespace fastIO
using namespace fastIO;
const int N = 100005;
const long long INF = 0x3f3f3f3f3f3f3f3fll;
int n, m, k;
long long f[N][128];
struct node {
  int w, v[7];
  bool operator<(const node &rhs) const { return w > rhs.w; }
} a[N];
int main() {
  read(n), read(m), read(k);
  for (register int i = 1; i <= n; ++i) read(a[i].w);
  for (register int i = 1; i <= n; ++i)
    for (register int j = 0; j < m; ++j) read(a[i].v[j]);
  std::sort(a + 1, a + 1 + n);
  for (register int i = 0; i < (1 << m); ++i) f[0][i] = -INF;
  f[0][0] = 0;
  for (register int i = 1; i <= n; ++i)
    for (register int S = 0; S < (1 << m); ++S) {
      int cnt = 0;
      f[i][S] = -INF;
      for (register int j = 0; j < m; ++j)
        if (S >> j & 1)
          ++cnt,
              f[i][S] = std::max(f[i][S], f[i - 1][S ^ (1 << j)] + a[i].v[j]);
      if (i - cnt <= k)
        f[i][S] = std::max(f[i][S], f[i - 1][S] + a[i].w);
      else
        f[i][S] = std::max(f[i][S], f[i - 1][S]);
    }
  print(f[n][(1 << m) - 1]);
}
