#include <bits/stdc++.h>
//#include "bits/stdc++.h"
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
typedef vector<int> VI;
typedef vector<VI> VVI;//例: VVI dp(10, vector<int>(10, INF);
typedef priority_queue<int, vector<int>, less<int> > QUE_int;
const int INF = 2 * pow(10, 9) + 1;//+1しないとREになるかも(out of rangeになるんかな?? )

vector<int> dx = { -1, 0, 1, 0, -1, -1, 1, 1 };
vector<int> dy = { 0, -1, 0, 1, -1, 1, -1, 1 };

ll max(ll a, ll b) { return (a > b) ? a : b; }
ll min(ll a, ll b) { return (a < b) ? a : b; }

////////////////////////////////////////////////////////////////

// auto mod int
// https://youtu.be/L8grWxBlIZ4?t=9858
// https://youtu.be/ERZuLAxZffQ?t=4807 : optimize
// https://youtu.be/8uowVvQ_-Mo?t=1329 : division
const int mod = pow(10, 9) + 7;
struct mint {
	ll x; // typedef long long ll;
	mint(ll x = 0) :x((x%mod + mod) % mod) {}
	mint operator-() const { return mint(-x); }
	mint& operator+=(const mint a) {
		if ((x += a.x) >= mod) x -= mod;
		return *this;
	}
	mint& operator-=(const mint a) {
		if ((x += mod - a.x) >= mod) x -= mod;
		return *this;
	}
	mint& operator*=(const mint a) {
		(x *= a.x) %= mod;
		return *this;
	}
	mint operator+(const mint a) const {
		mint res(*this);
		return res += a;
	}
	mint operator-(const mint a) const {
		mint res(*this);
		return res -= a;
	}
	mint operator*(const mint a) const {
		mint res(*this);
		return res *= a;
	}
	mint pow(ll t) const {
		if (!t) return 1;
		mint a = pow(t >> 1);
		a *= a;
		if (t & 1) a *= *this;
		return a;
	}

	// for prime mod
	mint inv() const {
		return pow(mod - 2);
	}
	mint& operator/=(const mint a) {
		return (*this) *= a.inv();
	}
	mint operator/(const mint a) const {
		mint res(*this);
		return res /= a;
	}
};
// combination mod prime
// https://www.youtube.com/watch?v=8uowVvQ_-Mo&feature=youtu.be&t=1619
struct combination {
	vector<mint> fact, ifact;
	combination(int n) :fact(n + 1), ifact(n + 1) {
		assert(n < mod);
		fact[0] = 1;
		for (int i = 1; i <= n; ++i) fact[i] = fact[i - 1] * i;
		ifact[n] = fact[n].inv();
		for (int i = n; i >= 1; --i) ifact[i - 1] = ifact[i] * i;
	}
	mint operator()(int n, int k) {
		if (k < 0 || k > n) return 0;
		return fact[n] * ifact[k] * ifact[n - k];
	}
};


////////////////////////////////////////////////////////////////


int main(void) {
	int H, W, K;
	cin >> H >> W >> K;
	vector<string> S(H);//H × W
	for(int i=0; i<H; i++) cin >> S[i];

	
	// cout << "----------------------output------------------" << endl;
	// cout << " H: " << H << " W: " << W << " K: " << K << endl;
	// for(int h=0; h< S.size(); h++){
	// 	for(int w=0; w<S[h].size(); w++){
	// 		cout << S[h][w];
	// 	}
	// 	cout << endl;
	// }
	// cout << " 2^(H-1): " << (1<< (H-1)) << endl;

	ll ans = INF;
	//bit全探索
	for(int i=0; i < (1<< (H-1)); i++ ){//2(^(H-1)回ループ)
		//cout << " bit i: " << i << endl;
		vector<bool> h_cut(H-1, false);//h_cut[i]:上からi番目の横方向を,割るor割らない
		vector<bool> w_cut(W-1, false);
		for(int j=0; j< (H-1); j++){
			if( (i>>j) & 1){//2進表記のiの j 番目が1ならば
				h_cut[j] = true;
			}
		}
		int g_id = 0;//group_id
		vector<int> H_pos_id(H, -1);//H_pos_id[j]: 上からj番目のチョコのgroup_id
		H_pos_id[0] = 0;
		for(int j=1; j<H; j++){
			if(h_cut[j-1] == true) g_id++;
			H_pos_id[j] = g_id;
		}

		vector<int> num_white(g_id+1, 0);
		vector<int> change_zero(g_id+1, 0);
		//w=      0
		bool is_can = true;
		for(int h=0; h<H; h++){
				if(S[h][0] == '1') num_white[H_pos_id[h]]++;//ホワイトチョコなら++
				//cout << " h: " << h << " S[h][0]: " << S[h][0] << " H_pos_id["<<h<<"]: " << H_pos_id[h] << " num_white["<<H_pos_id[h]<<"]: " << num_white[H_pos_id[h]] << endl;
				if(num_white[H_pos_id[h]] > K){
					is_can = false;//1列目ですでにKを越えていて条件を満たさない(※1)
					break;
				}
		}
		if(is_can == false) continue;//(※1)

		//w=    1 ~ W-1
		for(int w=1; w<W; w++){
			//cout << " w: " << w << endl;
			for(int h=0; h<H; h++){
				if(S[h][w] == '1') num_white[H_pos_id[h]]++;//ホワイトチョコなら++
				if(num_white[H_pos_id[h]] > K){
					if(w_cut[w-1] == true){//(※3)
						is_can = false;//注目している1列のみでKを越えているので条件を満たさない(※2)
						break;
					} 
					w_cut[w-1] = true;//(※3)
					num_white = change_zero;//縦に線を入れたので，0にする
					w--; break;//もう一度数え直すためにデクリメントしてwループへ移動
				}
				
			}
			if(is_can == false) break;//(※2)
			
		}
		if(is_can == false) continue;//(※2)
		
		int num_cut = 0;
		for(int w=0; w<w_cut.size(); w++){
			//cout << " w: " << w << " w_cut[" << w << "]: " << w_cut[w] << endl;
			if(w_cut[w]==true) num_cut++;
		}
		for(int h=0; h<h_cut.size(); h++){
			if(h_cut[h]==true) num_cut++;
		}
		//cout << "bit i: " << i <<  " calculating... " << " w_cut.size(): " << w_cut.size() <<" h_cut.size(): " << h_cut.size() << " num_cut: " << num_cut  << endl;;
		
		ans = min(ans, num_cut);



	}
	
	cout << ans << endl;

}




Measured memory_bytes: 256