问题是:
输出所有可能性,在5天的一周内混合3类数学,3类pc编程,2类物理,考虑到在一周中一个学生至少有一个这样的类和最多3,无论他们如何混合“
M:[数学,数学,数学]
T:[pc progr,pc progr]
W:[pc progr]
T:[物理]
F:[物理]
我在Python中有一个想法,创建一个包含15个元素的列表,这些元素将包含一周15/5 = 3(学生可以拥有的最大班级)的所有类。因此对于上面的示例,列表将看起来像{ {1}}但我真的不知道如何使用回溯生成所有列表。你能给我任何想法吗?
答案 0 :(得分:1)
首先尝试解决一个更简单的问题。尝试输出所有可能性以混合具有两个以上约束的类:
没有课程可以在一天内出现一次以上
一天中课程的顺序无关紧要
与往常一样,回溯问题最容易通过递归来解决它们。执行以下操作:按照任何顺序获取类的顺序cs,cs,cs,m,m,m,p,p,并在递归的每一步中将下一个类分配给“可能”的日期。如果它到目前为止分配的类少于3个,并且还没有相同类型的类,那么这里可以有一天。
为了避免在可能性中重复添加一个要求 - 如果在递归的当前步骤中我们需要将A类分配到某一天并且A类已经添加到某些日子,那么只尝试分配A在本周晚些时候,然后是它被分配到的最后一个。因为这听起来有点令人困惑,让我举一个例子:
假设我们拥有当前状态:
M: m, cs
T: 0
W: cs
T: p
F: p
在下一步我们必须添加一个cs类。如上所述,我们只会在几天之后再尝试W,即星期四和星期五。它需要一些考虑,但你应该能够弄清楚如果我们不添加这个限制,一些可能性将被发现一次。
在两种情况下满足递归的结束:
如果所有课程都已分配到某一天我们已找到可能的分配并输出
如果在下一步我们需要将A类分配到某一天,但是A已经被分配到一周的某一天说X和X之后的所有日子已经分配了3个类,那么我们找不到A的可能日期,因此在这个分支中找不到可能的解决方案。
现在已经解决了这个问题,请尝试删除我逐个添加的两个附加约束。首先修改解决方案,使得一个类可能在一天内出现一次以上(尽管在这种情况下问题似乎更简单,但需要额外的工作来避免计算一些可能性,然后再多一次)。在此之后删除最后剩余的约束 - 使一天中的类的顺序成为问题。有一个简单的方法,但我不确定是否允许你说明问题 - 在找到解决方案后,在其中的所有日子做所有排列,以产生所有可能的安排。
我真的希望这个答案有所帮助。我可以写下我上面提到的所有问题的解决方案,但我更愿意尝试给你提示如何自己解决这些问题,以便你自己实际做到这些。