#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;


#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define PSET(x,y) fixed<<setprecision(y)<<x
#define pb push_back
#define pii pair<int,int>
#define pf push_front
#define mp make_pair
#define vi vector<int>
#define vip vector<pair<int,int> >
#define ff first
#define ss second
#define int long long
#define mod 1000000007
#define BIG 998244353
#define s(t) scanf("%lld",&t)
#define p(t) printf("%lld\n",t)
#define mii map<int,int>
#define MSET(table,i) memset(table, i, sizeof(table))
#define endl '\n'
#define tc int t;cin>>t;while(t--)
#define pi  3.1415926358
#define bits(x) __builtin_popcount(x)
#define minimum(a,n) min_element(a,a+n)-a
#define maximum(a,n) max_element(a,a+n)-a
#define pqbig priority_queue<pii>
#define pqsmall priority_queue<pair<int,pii>,vector<pair<int,pii> >,greater<pair<int,pii> > >
#define all(v) v.begin(),v.end()
#define sitr set<int>:: iterator
#define spitr set<pii>:: iterator
#define mitr map<string,int>:: iterator

int toint(const string &s) {stringstream ss; ss << s; int x; ss >> x; return x;}
string tostring ( int number ) {stringstream ss; ss << number; return ss.str();}

typedef tree<pii, null_type, less<pii>, rb_tree_tag,
        tree_order_statistics_node_update>
        new_data_set;

#define trace1(x)                cerr<<#x<<": "<<x<<endl
#define trace2(x, y)             cerr<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl
#define trace3(x, y, z)          cerr<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl
#define trace4(a, b, c, d)       cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl
#define trace5(a, b, c, d, e)    cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<endl
#define trace6(a, b, c, d, e, f) cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<" | "<<#f<<": "<<f<<endl

int h, w, val;
int arr[15][1005];
int sum[15][1005];

int32_t main()
{
    fast;
    cin >> h >> w >> val;
    for (int i = 1; i <= h; i++)
    {
        for (int j = 1; j <= w; j++)
        {
            char ch; cin >> ch;
            arr[i][j] = ch - '0';
        }
    }

    int ans = 1e18;

    int range = 1ll << (h - 1);
    for (int mask = 0; mask < range; mask++)
    {

        for (int j = 0; j <= h; j++)
        {
            for (int k = 0; k <= w; k++)
                sum[j][k] = 0;
        }

        int last = 1;

        int id = 0;
        for (int j = 0; j < h - 1; j++)
        {
            if ((1ll << j)&mask)
            {
                for (int i = 1; i <= w; i++)
                {
                    for (int k = last; k <= (j + 1); k++)
                        sum[id][i]+=arr[k][i];
                }
                id++;
                last = j + 2;
            }
        }

        for (int i = 1; i <= w; i++)
        {
            for (int k = last; k <= h; k++)
                sum[id][i]+=arr[k][i];
        }
        id++;

        for (int i = 0; i < id; i++)
        {
            for (int j = 1; j <= w; j++)
                sum[i][j] += sum[i][j - 1];
        }

        last = 0;
        int cur = bits(mask);
        for (int j = 1; j <= w; j++)
        {
            bool flag = true;
            for (int k = 0; k < id; k++)
            {
                if (sum[k][j] - sum[k][last] > val)
                    flag = false;
            }

            if (!flag and last == j - 1)
            {
                cur = 1e18;
                break;
            }

            if (!flag)
                cur++, last = j - 1, j--;
        }

        ans = min(ans, cur);
    }
    cout << ans << endl;
}

Measured memory_bytes: 384