#include <bits/stdc++.h>
using namespace std;
template <typename T>
void print_container(ostream& os, const T& c) {
  const char* _s = " ";
  if (!c.empty()) {
    __typeof__(c.begin()) last = --c.end();
    for (__typeof__((c).begin()) it = (c).begin(); it != (c).end(); ++it) {
      os << *it;
      if (it != last) os << _s;
    }
  }
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& c) {
  print_container(os, c);
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& c) {
  print_container(os, c);
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const multiset<T>& c) {
  print_container(os, c);
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const deque<T>& c) {
  print_container(os, c);
  return os;
}
template <typename T, typename U>
ostream& operator<<(ostream& os, const map<T, U>& c) {
  print_container(os, c);
  return os;
}
template <typename T, typename U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <typename T>
void print(T a, int n, const string& split = " ") {
  for (int i = 0; i < n; i++) {
    cout << a[i];
    if (i + 1 != n) cout << split;
  }
  cout << endl;
}
template <typename T>
void print2d(T a, int w, int h, int width = -1, int br = 0) {
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (width != -1) cout.width(width);
      cout << a[i][j] << ' ';
    }
    cout << endl;
  }
  while (br--) cout << endl;
}
template <typename T>
void input(T& a, int n) {
  for (int i = 0; i < n; ++i) cin >> a[i];
}
template <typename T, typename U>
void upmin(T& a, const U& b) {
  a = min<T>(a, b);
}
template <typename T, typename U>
void upmax(T& a, const U& b) {
  a = max<T>(a, b);
}
template <typename T>
void uniq(T& a) {
  sort(a.begin(), a.end());
  a.erase(unique(a.begin(), a.end()), a.end());
}
template <class T>
string to_s(const T& a) {
  ostringstream os;
  os << a;
  return os.str();
}
template <class T>
T to_T(const string& s) {
  istringstream is(s);
  T res;
  is >> res;
  return res;
}
void fast_io() {
  cin.tie(0);
  ios::sync_with_stdio(false);
}
bool in_rect(int x, int y, int w, int h) {
  return 0 <= x && x < w && 0 <= y && y < h;
}
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
int main() {
  int h, w, k;
  int a[128][128];
  cin >> h >> w >> k;
  for (int y = 0; y < (int)(h); ++y)
    for (int x = 0; x < (int)(w); ++x) cin >> a[y][x];
  int res = ((long long)(1e9));
  if (w <= k) {
    for (int mask = 0; mask < (int)(1 << w); ++mask) {
      int change = 0;
      for (int y = 0; y < (int)(h); ++y) {
        int diff = 0;
        for (int x = 0; x < (int)(w); ++x)
          if ((mask >> x & 1) ^ a[y][x]) ++diff;
        change += min(diff, w - diff);
      }
      upmin(res, change);
    }
  } else {
    for (int fix_x = 0; fix_x < (int)(w); ++fix_x) {
      int change = 0;
      for (int x = 0; x < (int)(w); ++x) {
        int diff = 0;
        for (int y = 0; y < (int)(h); ++y)
          if (a[y][x] != a[y][fix_x]) ++diff;
        change += min(diff, h - diff);
      }
      upmin(res, change);
    }
  }
  if (res > k) res = -1;
  cout << res << endl;
}
