簡體   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