import std.algorithm;
import std.array;
import std.container;
import std.conv;
import std.math;
import std.numeric;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

int calc(int h, int w, int k, string[] S) {
    int ans = int.max;
    auto g = new int[h];
    for (int mask = 0; mask < (1 << (h - 1)); mask++) {
        int num = 0;
        foreach (i; 0..h) {
            g[i] = num;
            if ((mask >> i) & 1) num++;
        }
        num++; // +1 することでグループ総数になる

        int cut = num - 1; // カット回数
        int[10] cnt; // グループごとの 1 の個数
        for (int col = 0; col < w; col++) {
            for (int row = 0; row < h; row++) {
                if (S[row][col] == '1') cnt[g[row]]++;
            }
            foreach (i; 0..num) {
                if (cnt[i] > k) { // 溢れるので、ここで縦にカット
                    cut++;
                    cnt[] = 0;
                    for (int r = 0; r < h; r++) {
                        if (S[r][col] == '1') cnt[g[r]]++;
                    }
                    break;
                }
            }
            // 1 列のみでも溢れるかチェック
            foreach (i; 0..num) {
                if (cnt[i] > k) {
                    cut = int.max/2;
                    break;
                }
            }
        }
        ans = min(ans, cut);
    }
    return ans;
}

void main() {
    int h, w, k; scan(h, w, k);
    string[] S;
    foreach (_; 0..h) S ~= read!string;
    writeln(calc(h, w, k, S));
}

void scan(T...)(ref T a) {
    string[] ss = readln.split;
    foreach (i, t; T) a[i] = ss[i].to!t;
}
T read(T)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readint = read!int;
alias readints = reads!int;
