def I(): return int(eval(input()))

def MI(): return list(map(int, input().split()))

def LI(): return list(map(int, input().split()))



def main():

    mod=10**9+7

    H,W,K=MI()

    S=[[]for _ in range(H)]

    for i in range(H):

        S[i]=list(eval(input()))

        

    ans=10**10

    

    import itertools

    import bisect

    

    for ite in itertools.product([0,1], repeat=H):

        #高さ方向で全探索，0,1の切り替わりでグループを分ける

        g=[]#各グループの末尾列の番号

        cnt=[]#数えるよう,合計

        cnt2=[]#数えるよう,その列だけ

        now=-1

        for i in range(len(ite)):

            if ite[i]!=now:

                g.append(i-1)

                cnt.append(0)

                cnt2.append(0)

                now=ite[i]

        g.append(H-1)

        cnt.append(0)

        cnt2.append(0)

        temp=len(g)-2

        last=[0]#最後に追ったところを保存

        fl=0#Kを超えたら

        fl2=0#無理なとき

        for j in range(W):

            for k in range(len(cnt2)):

                cnt2[k]=0

            if fl2==1:

                break

            for i in range(H):

                if S[i][j]=="1":

                    num=bisect.bisect_left(g,i)

                    cnt[num]+=1

                    cnt2[num]+=1

                    if cnt[num]>K:

                        fl=1

                    

            if fl==1:

                for k in range(len(cnt)):

                    cnt[k]=cnt2[k]

                    cnt2[k]=0

                fl=0

                temp+=1

                last.append(j)

                if last[-1]==last[-2]:

                    temp=10**10

                    fl2=1

                    break

                

        #print(ite,temp,g,last)

        ans=min(ans,temp)

        

    print(ans)

                

                

                    

                    

                

        

        

    



main()

def I(): return int(eval(input()))

def MI(): return list(map(int, input().split()))

def LI(): return list(map(int, input().split()))



def main():

    mod=10**9+7

    H,W,K=MI()

    S=[]

    for _ in range(H):

        s=eval(input())

        S.append(s)

        

    # Hに関してbit全探索

    import itertools

    

    inf=10**10

    ans=inf

    

    import bisect

    for ite in itertools.product([0,1], repeat=H-1):

        temp=sum(ite)

        g=[-1]#グループに分ける，区切り(末尾)の数字をいれる

        for i in range(len(ite)):

            if ite[i]==1:

                g.append(i)

        

        M=len(g)

        cnt=[0]*M#グループ毎

        

        flag=1#無理かどうか

        for j in range(W):

            if flag==0:

                break

            cnt2=[0]*M#各列用

            

            #数える

            for i in range(H):

                if S[i][j]=="1":

                    num=bisect.bisect_left(g,i)-1

                    cnt[num]+=1

                    cnt2[num]+=1

            

            #無理

            for i in range(M):

                if cnt2[i]>K:

                    temp=inf

                    flag=0

                    break

                

            #わるか確認

            flag2=0

            for i in range(M):

                if cnt[i]>K:

                    flag2=1

                    break

            #わる

            if flag2:

                for i in range(M):

                    cnt[i]=cnt2[i]

                temp+=1

                

        # print(ite,temp,g)

                    

        ans=min(ans,temp)

        

    print(ans)

                  

                

                



main()

def I():
    return int(eval(input()))


def MI():
    return list(map(int, input().split()))


def LI():
    return list(map(int, input().split()))


def main():
    mod = 10**9 + 7
    H, W, K = MI()
    S = [[] for _ in range(H)]
    for i in range(H):
        S[i] = list(eval(input()))
    ans = 10**10
    import itertools
    import bisect

    for ite in itertools.product([0, 1], repeat=H):
        # 高さ方向で全探索，0,1の切り替わりでグループを分ける
        g = []  # 各グループの末尾列の番号
        cnt = []  # 数えるよう,合計
        cnt2 = []  # 数えるよう,その列だけ
        now = -1
        for i in range(len(ite)):
            if ite[i] != now:
                g.append(i - 1)
                cnt.append(0)
                cnt2.append(0)
                now = ite[i]
        g.append(H - 1)
        cnt.append(0)
        cnt2.append(0)
        temp = len(g) - 2
        last = [0]  # 最後に追ったところを保存
        fl = 0  # Kを超えたら
        fl2 = 0  # 無理なとき
        for j in range(W):
            for k in range(len(cnt2)):
                cnt2[k] = 0
            if fl2 == 1:
                break
            for i in range(H):
                if S[i][j] == "1":
                    num = bisect.bisect_left(g, i)
                    cnt[num] += 1
                    cnt2[num] += 1
                    if cnt[num] > K:
                        fl = 1
            if fl == 1:
                for k in range(len(cnt)):
                    cnt[k] = cnt2[k]
                    cnt2[k] = 0
                fl = 0
                temp += 1
                last.append(j)
                if last[-1] == last[-2]:
                    temp = 10**10
                    fl2 = 1
                    break
        # print(ite,temp,g,last)
        ans = min(ans, temp)
    print(ans)


main()

def I():
    return int(eval(input()))


def MI():
    return list(map(int, input().split()))


def LI():
    return list(map(int, input().split()))


def main():
    mod = 10**9 + 7
    H, W, K = MI()
    S = []
    for _ in range(H):
        s = eval(input())
        S.append(s)
    # Hに関してbit全探索
    import itertools

    inf = 10**10
    ans = inf
    import bisect

    for ite in itertools.product([0, 1], repeat=H - 1):
        temp = sum(ite)
        g = [-1]  # グループに分ける，区切り(末尾)の数字をいれる
        for i in range(len(ite)):
            if ite[i] == 1:
                g.append(i)
        M = len(g)
        cnt = [0] * M  # グループ毎
        flag = 1  # 無理かどうか
        for j in range(W):
            if flag == 0:
                break
            cnt2 = [0] * M  # 各列用
            # 数える
            for i in range(H):
                if S[i][j] == "1":
                    num = bisect.bisect_left(g, i) - 1
                    cnt[num] += 1
                    cnt2[num] += 1
            # 無理
            for i in range(M):
                if cnt2[i] > K:
                    temp = inf
                    flag = 0
                    break
            # わるか確認
            flag2 = 0
            for i in range(M):
                if cnt[i] > K:
                    flag2 = 1
                    break
            # わる
            if flag2:
                for i in range(M):
                    cnt[i] = cnt2[i]
                temp += 1
        # print(ite,temp,g)
        ans = min(ans, temp)
    print(ans)


main()

-    S = [[] for _ in range(H)] -    for i in range(H): -        S[i] = list(eval(input())) -    ans = 10**10 +    S = [] +    for _ in range(H): +        s = eval(input()) +        S.append(s) +    # Hに関してbit全探索 + +    inf = 10**10 +    ans = inf -    for ite in itertools.product([0, 1], repeat=H): -        # 高さ方向で全探索，0,1の切り替わりでグループを分ける -        g = []  # 各グループの末尾列の番号 -        cnt = []  # 数えるよう,合計 -        cnt2 = []  # 数えるよう,その列だけ -        now = -1 +    for ite in itertools.product([0, 1], repeat=H - 1): +        temp = sum(ite) +        g = [-1]  # グループに分ける，区切り(末尾)の数字をいれる -            if ite[i] != now: -                g.append(i - 1) -                cnt.append(0) -                cnt2.append(0) -                now = ite[i] -        g.append(H - 1) -        cnt.append(0) -        cnt2.append(0) -        temp = len(g) - 2 -        last = [0]  # 最後に追ったところを保存 -        fl = 0  # Kを超えたら -        fl2 = 0  # 無理なとき +            if ite[i] == 1: +                g.append(i) +        M = len(g) +        cnt = [0] * M  # グループ毎 +        flag = 1  # 無理かどうか -            for k in range(len(cnt2)): -                cnt2[k] = 0 -            if fl2 == 1: +            if flag == 0: +            cnt2 = [0] * M  # 各列用 +            # 数える -                    num = bisect.bisect_left(g, i) +                    num = bisect.bisect_left(g, i) - 1 -                    if cnt[num] > K: -                        fl = 1 -            if fl == 1: -                for k in range(len(cnt)): -                    cnt[k] = cnt2[k] -                    cnt2[k] = 0 -                fl = 0 +            # 無理 +            for i in range(M): +                if cnt2[i] > K: +                    temp = inf +                    flag = 0 +                    break +            # わるか確認 +            flag2 = 0 +            for i in range(M): +                if cnt[i] > K: +                    flag2 = 1 +                    break +            # わる +            if flag2: +                for i in range(M): +                    cnt[i] = cnt2[i] -                last.append(j) -                if last[-1] == last[-2]: -                    temp = 10**10 -                    fl2 = 1 -                    break -        # print(ite,temp,g,last) +        # print(ite,temp,g)