Este problema es más difícil de lo que parece.
Como otros han aludido, este es un problema NP-completo, pero analicemos lo que eso significa.
Básicamente, significa que debes buscar todas las combinaciones posibles.
Pero "mirar" no te dice mucho de lo que necesitas hacer.
Generar todas las combinaciones posibles es fácil. Puede producir una gran cantidad de datos, pero no debería tener muchos problemas para comprender los conceptos de esta parte del problema.
El segundo problema es el de juzgar si una combinación posible dada es buena, mala o mejor que la solución "buena" anterior.
Para ello, necesita algo más que "¿es una posible solución"?
Por ejemplo, ¿el mismo profesor trabaja 5 días a la semana durante X semanas seguidas? Incluso si esa es una solución que funciona, puede que no sea mejor que alternar entre dos personas para que cada maestro haga una semana cada uno. Oh, ¿no pensaste en eso? Recuerde, estas son personas con las que está tratando, no solo un problema de asignación de recursos.
Incluso si un maestro pudiera trabajar a tiempo completo durante 16 semanas seguidas, esa podría ser una solución subóptima en comparación con una solución en la que intentas alternar entre maestros, y este tipo de equilibrio es muy difícil de integrar en el software.
En resumen, producir una buena solución a este problema valdrá mucho, para muchas personas. Por lo tanto, no es un problema fácil de analizar y resolver. Esté preparado para marcar algunos objetivos que no están al 100% y llamarlos "suficientemente buenos".