问题: 鉴于一套强制性和选修课程,每个课程仅在某些时段(有7个时段)可用,生成所有可能的时间表。
示例:
对于必修课程:
可选课程:
(并非每个选修课程都必须包含在时间表中)
可能的解决方案之一是:
用PHP编写它的最有效方法是什么?
我目前正在尝试开发一种强力解决方案,但这是一项非常繁琐的工作,我正在寻找更有效的方法。我发现它是一个NP完全问题并且搜索了有助于解决这些问题的PHP课程,但是我担心目前没有这样的课程。
答案 0 :(得分:0)
首先,我同意布莱恩你首先需要对这个问题有充分的了解,然后对于算法来说,互联网对它们有所了解。
你说不是每个选修课程都必须包括在内,这意味着这种模式是唯一被接受的模式:
obc x x x x x x
其中obc是必修课,x是强制性或选择性的。顺序无关紧要。
如果您有N个强制性和M个选修课程(显然N + M> 7或N + M = 7)那么您只能拥有N个上述类型的模式。
然后你必须找到这种不同的时间表:
X X X X X X(6道菜)
这里的顺序并不重要,不允许重复,所以你需要6个(N + M)的组合,这将使得:
(N+M)!/[6!(N+M-6)!] = K different such timetables.
然后,7个课程的所有不同时间表将是:
K + K + ... + K(N次)= N * K
(仔细检查这是否正确,今天真的很累,否则会建议一些代码)。
我希望这可以提供一些帮助。
答案 1 :(得分:0)
问题:
问题:给出一套强制性和可选择的课程 仅在某些时隙(有7个时隙)生成 所有可能的时间表。
此处的关键是生成所有可能时间表。这样做很简单,但是无论如何都需要指数时间,因为你基本上列出了整个搜索空间(可能性)。
将是递归的并且获取对的列表,该对中的第一个是时隙,并且该对的第二个元素是可以填充时隙的可能类的列表。数据结构如下所示:
对于必修课程:
等。需要加粗课程的地方。 它还需要一个已经通过该方法的先前递归调用选择的课程列表。
该功能
<currentClass,myPick>
)赋予此调用实例的已选择类的列表。 这应该让你开始。