回溯python或c++;

回溯python或c++;,python,backtracking,Python,Backtracking,问题是: 考虑到学生在一周的一天中至少有一节数学课,最多有3节,无论如何混合,输出在一周的5天内混合3节数学课、3节pc编程课、2节物理课的所有可能性” M:[数学,数学,数学] T:[pc程序,pc程序] W:[pc程序] T:[物理学] F:[物理学] 我在Python中有一个想法,创建一个包含15个元素的列表,该列表将包含一周15/5=3的所有类(学生可以拥有的最大类),因此对于上面的示例,该列表将类似于[m,m,m,cs,cs,0,cs,0,0,p,0,0,p,0,0]但我真的不知道如何

问题是:

考虑到学生在一周的一天中至少有一节数学课,最多有3节,无论如何混合,输出在一周的5天内混合3节数学课、3节pc编程课、2节物理课的所有可能性”

M:[数学,数学,数学]
T:[pc程序,pc程序]
W:[pc程序]
T:[物理学]
F:[物理学]


我在Python中有一个想法,创建一个包含15个元素的列表,该列表将包含一周15/5=3的所有类(学生可以拥有的最大类),因此对于上面的示例,该列表将类似于
[m,m,m,cs,cs,0,cs,0,0,p,0,0,p,0,0]
但我真的不知道如何使用回溯生成所有列表。你能给我一些想法吗?

首先尝试解决一个更简单的问题。尝试输出所有可能的值,以混合具有两个以上约束的类:

  • 任何课程一天最多只能出现一次

  • 一天上课的顺序无关紧要

  • 与往常一样,回溯问题最容易用递归来解决。执行以下操作:按任意顺序取类的序列cs、cs、cs、m、m、m、p、p,并在递归的每一步将下一个类分配给“可能的”类“天啊。在这里,一天是可能的,如果它有少于3类分配到目前为止,它还没有一个类的相同类型

    为了避免重复的可能性,增加一个额外的要求-如果在递归的当前步骤中,我们需要将类A分配给某一天,并且类A已经添加到某些天,那么只尝试将A分配给一周后的天,然后再分配给最后一天。这听起来可能有点混乱,让我举个例子:

    假设我们拥有当前状态:

    M: m, cs
    T: 0
    W: cs
    T: p
    F: p
    
    在下一步中,我们必须添加一个cs类。如上所述,我们将只在几天后(即周四和周五)进行尝试。这需要一些考虑,但您应该能够理解,如果我们不添加此限制,则会多次发现某些可能性

    在两种情况下,递归结束:

    • 如果所有的类都被分配到某一天,我们就会找到一个可能的分配,并输出它

    • 如果在下一步中,我们需要将类别A分配给某一天,但A已经分配给一周中的某一天,例如X,并且X之后的所有天都有3个类别已经分配给他们,那么我们无法为A找到可能的日期,因此在该分支中找不到可能的解决方案

    现在,解决了这个稍微简单一点的问题后,请尝试逐个删除我添加的两个附加约束。首先修改解决方案,使类在一天中出现不止一次(尽管在这种情况下问题似乎更简单,但需要额外的工作来避免将某些可能性计算不止一次)。在这之后,去掉最后一个剩余的约束-使一天中的课程顺序变得重要。这有一个简单的方法,但我不确定是否允许,因为你陈述了问题-在找到解决方案后,在所有的日子里做所有的排列,以产生所有可能的安排


    我真的希望这个答案有帮助。我可以写下我上面提到的所有问题的解决方案,但我更愿意尝试给你一些技巧,告诉你如何自己解决这些问题,这样你就可以自己动手了。

    这看起来像是家庭作业,所以我添加了标签。如果我错了,请随意删除。不,我实际上在学习回溯的概念,我解决了一些问题,但它们只涉及简单的排列/安排,我想尝试更难的排列/安排,但需要这一个的想法。