Language: C++

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h> // uint64_t

#define HEIGHT_MAX 10
#define WIDTH_MAX 1000
#define BUF_SIZE (WIDTH_MAX+50)

// size: specify sizeof(str)
int get_str(char *str, int size) {
    if(!fgets(str, size, stdin)) return -1;
    return 0;
}

int get_int3(int *a1, int *a2, int *a3) {
#ifdef BUF_SIZE
  char line[BUF_SIZE];
  if(!fgets(line, BUF_SIZE, stdin)) return -1;
  sscanf(line, "%d %d %d", a1, a2, a3);
#else
#error
#endif
  return 0;
}

#define min(a,b) ((a) > (b) ? (b) : (a))

int main(void) {
    int height, width, ulimit;
    int i, j;
    static char map[HEIGHT_MAX][WIDTH_MAX];

    get_int3(&height, &width, &ulimit);
    
    for(i = 0; i < height; i++) {
        char buf[BUF_SIZE];
        get_str(buf, BUF_SIZE);
        for(j = 0; j < width; j++) {
            map[i][j] = (buf[j] - '0');
        }
    }
    int pat, bit;
    int ans = (WIDTH_MAX+HEIGHT_MAX);
    for(pat = 0; pat <(1<<height); pat+=2) {
        int res = __builtin_popcount(pat);
        if(res >= ans) continue;
        int sum[11] = {0};
        int group[11] = {0};
        int idx = 1;
        int wid;
        int moved = 0;
        // create groups
        for(bit = 0; bit <= height; bit++) {
            if(pat & (1<<bit)) group[idx++] = bit;
        }
        group[idx++] = height;
#ifdef DEBUG
        for(i = 0; i < idx; i++) printf("%d ", group[i]);
#endif

        // pat = 0: [0, 5]
        for(wid = 0; wid < width;) {
            int flag = 1;
            int new[11] = {0};
            for(i = 0; i < idx-1; i++) {
                for(bit = group[i]; bit < group[i+1]; bit++) {
                    new[i] += map[bit][wid];
                }
#ifdef DEBUG
                for(j = 0; j < idx-1; j++) { printf("(%d+%d) vs %d\n", new[i], sum[i], ulimit); }
#endif
                // must split
                if(sum[i] + new[i] > ulimit) { flag = 0; break; }
            }
#ifdef DEBUG
            printf("flag: %d ", flag);
#endif
            if(!flag) {
                if(!moved) { break; }
                res++;
                moved = 0;
                for(i = 0; i < idx-1; i++) sum[i] = 0;
            } else {
                moved = 1;
                wid++;
                for(i = 0; i < idx-1; i++) sum[i] += new[i];
            }
        }
#ifdef DEBUG
        printf("[pat: %d] possible?: %d ans: %d\n", pat, moved, res);
#endif
        if(!moved) continue;
        ans = min(ans, res);
    }
    printf("%d\n", ans);
    return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:65:17: error: expected unqualified-id before 'new'
   65 |             int new[11] = {0};
      |                 ^~~
a.cc:68:24: error: expected type-specifier before '[' token
   68 |                     new[i] += map[bit][wid];
      |                        ^
a.cc:74:32: error: expected type-specifier before '[' token
   74 |                 if(sum[i] + new[i] > ulimit) { flag = 0; break; }
      |                                ^
a.cc:74:32: error: expected ')' before '[' token
   74 |                 if(sum[i] + new[i] > ulimit) { flag = 0; break; }
      |                   ~            ^
      |                                )
a.cc:87:57: error: expected type-specifier before '[' token
   87 |                 for(i = 0; i < idx-1; i++) sum[i] += new[i];
      |                                                         ^