繁体   English   中英

回溯python或c ++

[英]backtracking python or c++

问题是:

考虑到在一周中的某一天学生至少有其中一门课程,而最多有三门课程,则输出在5天的一周内混合3门数学课程,3门pc编程课程,2门物理课程的所有可能性不管它们如何混合”

M:[数学,数学,数学]
T:[个人电脑程序,个人电脑程序]
W:[个人电脑程序]
T:[物理学]
F:[物理学]

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

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

  1. 每天一次班级上课人数最多

  2. 一天的课程顺序无关紧要

与回溯问题一样,最简单的方法是递归解决。 请执行以下操作:以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类分配给了某周,例如X,并且X之后的所有天数已经分配了3个类,那么我们找不到可能的一天对于A,因此在此分支中找不到可能的解决方案。

现在已经解决了这个简单的问题,请尝试删除我逐个添加的两个其他约束。 首先以某种方式修改解决方案,使一个班级每天出现的次数多于一次(尽管在这种情况下问题似乎更简单),但需要额外的工作来避免多次计算某些可能性。 在此之后,删除最后剩下的约束-在一天中确定课程的顺序。 有一个简单的方法,但是在您陈述问题时我不确定是否允许-找到解决方案后,在其中进行所有工作,以产生所有可能的安排。

我真的希望这个答案会有所帮助。 我可以写下我上面提到的所有问题的解决方案,但我更愿意尝试向您提供有关如何自行解决这些问题的技巧,以便您实际可以自己解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM