Hola,
Hay muchas formas de resolverlo. La forma en que está implementada la solución surge de observar el ejemplo. Si vés el ejemplo, se aprecia que la primera fila tiene primero 0s y luego 1s, y el resto (la 2da fila en adelante) se puede ver que son dos submatrices iguales concatenadas ( o sea M M ).
Entonces para construir la matriz seguís ese mismo procedimiento:
Se empieza por M=[0 1], que son todas las combinaciones posibles de largo 1 de 0s y 1s
Ese [0 1] se duplica y se agrega una primer fila con mitad ceros y mitad de unos. O sea, a cada combinación posible de largo 1 se le agrega primero un 0 y luego un 1, construyéndose todas las combinaciones posibles de largo 2 de 0s y 1s.
Al final queda:
0 0 1 1 que es lo mismo que M = [zeros(1,size(M,2)) ones(1,size(M,2)); M M];
0 1 0 1
Con este nuevo M se repite el proceso para k=3. Se toma cada solución para k=2 y se le agrega un 0 y luego un 1. Con esto se hacen todas las combinaciones posibles para k=3.
Llevado a código queda igual:
M = [zeros(1,size(M,2)) ones(1,size(M,2)); M M]; quedando
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
y así sucesivamente.
Pero esta es una idea de cómo programarlo. Podría haber otras. La idea fuerza es aprovechar algún patrón que veas en las combinaciones de 0s y 1s y llevarlo al código.
Espero que haya quedado algo más claro.
saludos,
Eduardo