#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <set>
using ll = long long;
using uint = unsigned int;
using graph = std::vector<std::vector<ll>>;
using wGraph = std::vector<std::vector<std::pair<ll,ll>>>;
#define rep(i,n) for (int i=0; i < int(n); i++)

using namespace std;
ll MOD7 = 1000000007;
ll MOD9 = 1000000009;
vector<ll> InputVec(ll N){
    vector<ll> A(N);
    for (int i = 0; i < N; ++i) {
        cin >> A[i];
    }
    return A;
}
void OutputVec(vector<ll> A){
    for (int i = 0; i < A.size(); ++i) {
        cout << A[i] << ",";
    }
    cout << endl;
}
vector<vector<ll>> InputVec2d(ll H,ll W){
    vector<vector<ll>> A(H);
    for (int yi = 0; yi < H; ++yi) {
        A[yi] = vector<ll>(W);
    }
    for (int yi = 0; yi < H; ++yi) {
        for (int xi = 0; xi < W; ++xi) {
            cin >> A[yi][xi];
        }
    }
    return A;
}
vector<vector<char>> InputVec2dStr(ll H,ll W){
    vector<vector<char>> A(H);
    for (int yi = 0; yi < H; ++yi) {
        A[yi] = vector<char>(W);
    }
    for (int yi = 0; yi < H; ++yi) {
        string S;
        cin >> S;
        for (int xi = 0; xi < W; ++xi) {
            A[yi][xi] = S[xi];
        }
    }
    return A;
}

void OutputVec2d(vector<vector<ll>> A){
    for (int yi = 0; yi < A.size(); ++yi) {
        for (int xi = 0; xi < A[yi].size(); ++xi) {
            cout << A[yi][xi] << ",";
        }
        cout << endl;
    }
}

graph InputGraph(ll N,ll M){
    graph G(N);
    for (int i = 0; i < M; ++i) {
        ll a,b;
        cin >> a >> b;
        a--;b--;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    return G;
}
graph InputDGraph(ll N,ll M){
    graph G(N);
    for (int i = 0; i < M; ++i) {
        ll a,b;
        cin >> a >> b;
        a--;b--;
        G[a].push_back(b);
    }
    return G;
}

void OutputGraph(graph G){
    for (int i = 0; i < G.size(); ++i) {
        cout << i << ":";
        for (int j = 0; j < G[i].size(); ++j) {
            cout << G[i][j]<< ",";
        }
        cout << endl;
    }
}

int main() {
    ll H,W,K;
    cin >> H >> W >> K;
    auto S = InputVec2dStr(H,W);
    ll m = 1ll << 50;
    for (uint i = 0; i < (1 << (H-1)); ++i) {
        vector<ll> cut(H);
        ll cutCount = 0;
        cut[0] = 0;
        for (int j = 1; j < H; ++j) {
            if(i & (1 << (j - 1))){
                cut[j] = cut[j-1] + 1;
            }else{
                cut[j] = cut[j-1];
            }
        }
        vector<ll> count(cut[H-1] + 1);
        cutCount += cut[H-1];
        //OutputVec(cut);

        for (int xi = 0; xi < W; ++xi) {
            vector<ll> tmpCount(count.size());
            for (int yi = 0; yi < H; ++yi) {
                tmpCount[cut[yi]] += (S[yi][xi] - '0');
            }
            for (int yi = 0; yi < tmpCount.size(); ++yi) {
                if(tmpCount[yi] > K){
                    cutCount = 1ll << 50;
                }
            }
            for (int yi = 0; yi < tmpCount.size(); ++yi) {
                if(count[yi] + tmpCount[yi] > K){
                    //Reset
                    for (int ri = 0; ri < tmpCount.size(); ++ri) {
                        count[ri] = tmpCount[ri];
                    }
                    cutCount++;
                    break;
                }else{
                    count[yi] += tmpCount[yi];
                }
            }
        }
        m = min(m,cutCount);
    }
    cout << m << endl;
}


Measured memory_bytes: 256