まず、より簡単な問題を解いてみてください。すべての可能性を出力して、さらに 2 つの制約を持つクラスを混合してみてください。
どのクラスも 1 日に複数回表示することはできません
1日の授業の順番は問いません
バックトラック問題ではいつものように、再帰で解決するのが最も簡単です。次のことを行います: cs、cs、cs、m、m、m、p、p の順序で一連のクラスを取得し、再帰の各ステップで次のクラスを「可能な」日に割り当てます。これまでに割り当てられたクラスが 3 つ未満で、同じタイプのクラスがまだない場合、1 日が可能です。
可能性の繰り返しを避けるために、もう 1 つの要件を追加します。再帰の現在のステップで、クラス A をある日に割り当てる必要があり、クラス A がすでにいくつかの日に追加されている場合は、A を数日後に割り当てるようにしてください。割り当てられた最後の週。これは少し紛らわしいかもしれませんので、例を挙げましょう。
現在の状態があるとします。
M: m, cs
T: 0
W: cs
T: p
F: p
次のステップでは、cs クラスを追加する必要があります。上で説明したように、木曜日と金曜日から数日後だけを試します。いくつかの考慮が必要ですが、この制限を追加しないと、いくつかの可能性が何度も見つかることを理解できるはずです.
再帰の終わりは、次の 2 つのケースで満たされます。
この少し簡単な問題を解決したので、追加した 2 つの制約を 1 つずつ削除してみてください。最初に、クラスが 1 日に複数回出現するようにソリューションを変更します (ただし、この場合、いくつかの可能性を複数回カウントすることを避けるために、追加の作業が必要になるため、問題はより単純に見えます)。この後、最後に残った制約を取り除きます - 1 日の問題のクラスの順序を作ります。それには簡単なアプローチがありますが、あなたが問題を述べているようにそれが許可されているかどうかはわかりません.
この回答がお役に立てば幸いです。上で述べたすべての問題の解決策を書き留めることができますが、実際に自分でできるように、自分でそれらにアプローチする方法のヒントを提供したいと思います.