#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
#define FIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define PI 3.141592653589793238462643383279502884L
#define make_unique(vec) vec.resize(distance(vec.begin(),unique(vec.begin(),vec.end())))
#define Sort(vec) sort(vec.begin(),vec.end())
#define RSort(vec) sort(vec.rbegin(),vec.rend())
#define endl "\n"
#define tr1(i) cout<<i<<endl;
#define tr2(i,j) cout<<i<<" "<<j<<endl;
#define tr3(i,j,k) cout<<i<<" "<<j<<" "<<k<<endl;
#define vvi vector<vector<int> > 
#define vvl vector<vector<ll> >
#define all(st) st.begin(),st.end()
#define vpl vector<pair<ll,ll> >
#define vpi vector<pair<int,int> >
#define pi pair<int,int>
#define pl pair<ll,ll>
#define al vector<list<int> >
#define vs vector<string>
#define vb vector<bool>
#define vi vector<int>
#define vl vector<ll>
#define vc vector<char>
#define rep(i,l,r) for(int i=l;i<r;i++)
#define repit(st) for(auto it=st.begin();it!=st.end();it++)
#define ull unsigned long long int
#define eb emplace_back
#define pb push_back
#define ll long long int
#define minf -(1e18)
#define inf 1e18
#define f first
#define se second
#define mod 1000000007
using namespace std;
using namespace __gnu_pbds; 
ll mi(ll n,ll m){ll pw=n%m;ll ex=m-2;ll ans=1;while(ex){if(ex&1) ans = ans*pw%m;pw = pw*pw%m;ex>>=1;}return ans%mod;}
ll pw(ll a,ll n){ll pw=a;ll ex=n;ll ans=1;while(ex){if(ex&1) ans = ans*pw;pw = pw*pw;ex>>=1;}return ans;}
ll pwm(ll a,ll n){ll pw=a%mod;ll ex=n;ll ans=1;while(ex){if(ex&1) ans = ans*pw%mod;pw = pw*pw%mod;ex>>=1;}return ans%mod;}
template<typename T>istream &operator>>(istream &is, vector<T> &v) { for (T &t : v) is >> t; return is; }
template<typename T>ostream &operator<<(ostream &os, const vector<T> &v) { for (const T &t : v) {os << t <<" ";} os << '\n'; return os; }
template<typename T> using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
//st.order_of_key(num)->number of elements <=num
//st.find_by_order(i)->iterator of ith element in sorted order starting from zero
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll max(ll a,ll b){return a>b?a:b;}
ll min(ll a,ll b){return a<b?a:b;}
ll Abs(ll x){return x>0?x:(-x);}
ll Ceil(ll a,ll b){return a/b+(a%b!=0);}
#define bs binary_search
#define lb lower_bound
#define ub upper_bound
#define mkp make_pair
//#define d double
//#define int long long int
//Binary_Search->dp->greedy
void solve(){
	ll n,m,k;
	cin>>n>>m>>k;
	vector<string> vec(n);
	for(int i=0;i<n;i++) cin>>vec[i];
	vvl pc(m,vl(n));
	for(int j=0;j<m;j++){
		if(vec[0][j]=='1') pc[j][0]=1;
		for(int i=1;i<n;i++){
			pc[j][i]=pc[j][i-1];
			if(vec[i][j]=='1') pc[j][i]=pc[j][i-1]+1;
		}
	}
	ll ans=inf;
	for(int mask=0;mask<(1<<(n-1));mask++){
		vi ind;
		for(int j=0;j<n-1;j++){
			if(mask&(1<<j)) ind.pb(j);
		}
		bool ok=true;
		int sz=ind.size();
		vvl no(sz+1,vl(m));
		if(sz==0){
			for(int j=0;j<m;j++){
				no[0][j]=pc[j][n-1];
			}
		}
		else{
			for(int j=0;j<m;j++){
				no[0][j]=pc[j][ind[0]];
				no[sz][j]=pc[j][n-1]-pc[j][ind[sz-1]];
				for(int i=1;i<sz;i++) no[i][j]=pc[j][ind[i]]-pc[j][ind[i-1]];
			}
		}
		for(int i=0;i<=sz;i++){
			for(int j=0;j<m;j++){
				if(no[i][j]>k) ok=false;
			}
		}
		if(!ok) continue;
		vl sum(sz+1);
		for(int i=0;i<=sz;i++) sum[i]=no[i][0];
		ll cnt=sz;
		for(int j=1;j<m;j++){
			bool okk=true;
			for(int i=0;i<=sz;i++){
				if(sum[i]+no[i][j]>k) okk=false;
			}
			if(okk){
				for(int i=0;i<=sz;i++){
					sum[i]+=no[i][j];
				}
			}
			else{
				cnt++;
				for(int i=0;i<=sz;i++){
					sum[i]=no[i][j];
				}
			}
		}
		ans=min(ans,cnt);
	}
	cout<<ans<<endl;
 
}
int32_t main(){
int t=1;
//scanf("%d",&t);
while(t--){
	solve();
}
}   

Measured memory_bytes: 512