program main
    implicit none
    integer(8):: h,w,k
    integer(8):: i,j
    integer(8), allocatable:: c(:,:), now(:)
    integer(8), parameter:: inf = 1001001001
    character(1), allocatable:: s(:,:)
    read*, h,w,k
 
    allocate(s(w,h))

    block
        character(:), allocatable:: input_s
        allocate(character(w)::input_s)

        do i=1,h
            read*, input_s(:)
            do j=1,w
                s(j,i) = input_s(j:j)
            end do
        end do
    end block

    block
        integer(8):: div, g, ints, num
        integer(8):: ans = inf
        integer(8), allocatable:: id(:)
        logical:: emp, ok

        allocate(id(h))
        do div=1, lshift(1, h-1)
            g = 1

            do i=1, h
                id(i) = g
                if (and(rshift(div-1,i-1), 1) == 1) g=g+1
            end do

            allocate(c(w, maxval(id)))
            c(:,:) = 0

            do i=1,h
                do j=1,w
                    read(s(j,i),*) ints
                    c(j,id(i))=c(j,id(i))+ints
                end do 
            end do

            ok=.true.
            do i=1,g
                do j=1,w
                    if(c(j,i) > k) ok = .false.
                end do
            end do

            if (.not. ok) cycle

            allocate(now(g+1))
            num = g-1
            now(:) = 0
            do j=1,w
                if (.not. add(j,g)) then
                    num=num+1
                    now(:)=0
                    emp = add(j,g)
                end if
            end do 

            ans = min(ans,num)
            deallocate(c)
            deallocate(now)
        end do

        print*, ans
    end block

contains
function add(j,g) result(ok)
    integer(8):: i,j,g
    logical:: ok

    do i=1,g
        now(i)=now(i)+c(j,i)
    end do

    ok=.true.
    do i=1,g+1
        if (now(i) > k) ok=.false.
    end do
end function

end program main