Esse problema é mais difícil do que parece.
Como outros já mencionaram, este é um problema NP-completo, mas vamos analisar o que isso significa.
Basicamente, significa que você deve examinar todas as combinações possíveis.
Mas "olhar para" não diz muito o que você precisa fazer.
É fácil gerar todas as combinações possíveis. Pode produzir uma grande quantidade de dados, mas você não deve ter muitos problemas para entender os conceitos dessa parte do problema.
O segundo problema é julgar se uma dada combinação possível é boa, má ou melhor do que a solução "boa" anterior.
Para isso, você precisa mais do que apenas "é uma solução possível".
Por exemplo, o mesmo professor trabalha 5 dias por semana durante X semanas seguidas? Mesmo que seja uma solução viável, pode não ser melhor do que alternar entre duas pessoas para que cada professor faça uma semana cada. Oh, você não pensou sobre isso? Lembre-se de que você está lidando com pessoas, não apenas com um problema de alocação de recursos.
Mesmo se um professor pudesse trabalhar em tempo integral por 16 semanas consecutivas, isso poderia ser uma solução abaixo do ideal em comparação com uma solução em que você tenta alternar entre os professores, e esse tipo de equilíbrio é muito difícil de incluir no software.
Para resumir, produzir uma boa solução para esse problema valerá muito, para muitas pessoas. Portanto, não é um problema fácil de analisar e resolver. Esteja preparado para definir alguns objetivos que não sejam 100% e chamá-los de "bons o suficiente".