2017-03-05 66 views
0

所以,我總共有n個問題,每個問題都有一些問題。python回溯字典

我要創建的是有uv問題之間積累xy點之間問題的所有可能的集合,和我有使用回溯做。爲此,我想了解如何使用字典,例如:questions = {「Q1」:5,「Q2」:3,「Q3」:4,「Q4」:10,「Q5」:6,「Q6 「:7},所以有6個問題,第一個問題(」Q1「)有5個點等等

我開始編碼,但我不知道如何創建回溯函數本身,我不明白如果有意義的話,如何去做所有的可能性。

questions = {"Q1":5, "Q2":3, "Q3": 4, "Q4" : 10, "Q5" : 6, "Q6" : 7} 
u = 3 # 
v = 5 # between u and v questions 


x = 5 # 
y = 100 #between x and y points 


def get_points(ar): 
    s = 0 
    for key, value in ar.items(): 
     s = s + int(value) 
    return s 


def get_NOQuestions(ar): 
    return len(ar) 



def reject(candidate): 
    if (get_points(candidate) > y and get_NOQuestions(candidate) < v) or (get_NOQuestions(candidate) >= v and get_points(candidate) < x): 
     return False 
    return True 



def accept(candidate): 
    if get_points(candidate) >= x and get_points (candidate) <= y and get_NOQuestions(candidate) >= u and get_NOQuestions(candidate) <= v: 
     return True 
    return False 



def output(candidate): 
    print(candidate) 



ar = {} 

def backtracking(k): 
    for key, value in questions.items(): 
     ar[key] = value 
     if not reject(ar): 
      if accept(ar): 
       output(ar) 
      else: 
       backtracking(k+1) 

backtracking(0) 

這是我這麼遠,顯然是「回溯」功能不起作用,因爲它不經過所有的可能性(而不是它應該以這種形式,它只是一個供)

我在考慮可能對字典中的所有項目進行排列(uv之間的長度排列),並獲得滿足「接受」函數中條件的條件,但確實有更明智的方法來完成此操作。

回答

0

您需要重寫您的reject()accept()函數的邏輯,因爲您的代碼將永遠無法達到給定輸入的if accept(ar)。試着在紙上運行你的代碼,你會發現它。

我也建議重構get_points(arr)到這樣的事情:

def get_points(arr): 
    return sum(arr.values()) 

較少的邏輯==更少的錯誤。

+0

所以你說實際的回溯函數本身經歷了所有的可能性,只是我的接受和拒絕函數是不好的?因爲我懷疑是這種情況 感謝您的建議btw :) – Hansewl