2017-08-14 68 views
0
def fastMaxVal(w, v, i, aW): 
    global numCalls 
    numCalls += 1 
    try: return m[(i, aW)] 
    except KeyError: 
     if i == 0: 
      if w[i] <= aW: 
       m[(i, aW)] = v[i] 
       return v[i] 
      else: 
       m[(i, aW)] = 0 
       return 0 
     without_i = fastMaxVal(w, v, i-1, aW) 
     if w[i] > aW: 
      m[(i, aW)] = without_i 
      return without_i 
     else: 
      with_i = v[i] + fastMaxVal(w, v, i-1, aW - w[i]) 
     res = max(with_i, without_i) 
     m[(i, aW)] = res 
     return res 

def maxVal0(w, v, i, aW): 
    m = {} 
    return fastMaxVal 

weights = [1, 1, 5, 5, 3, 3, 4, 4] 
vals = [15, 15, 10, 10, 9, 9, 5, 5] 
numCalls = 0 
res = maxVal0(weights, vals, len(vals) - 1, 8) 
print ('max Val =', res, 'number of calls =', numCalls) 

該程序是關於01Knapsack問題。我使用決策樹來解決問題。但是,我運行該程序並得到以下結果。輸出錯誤是0x03BB7390

最大的Val =在通話0x03BB7390數函數fastMaxVal = 0

這有什麼錯我的計劃?

+0

這不是一個錯誤。您只需從'maxVal0'返回*函數*'fastMaxVal'。你必須*調用函數*。 –

+0

請說出您正在使用的語言,並將錯誤減少到導致問題的代碼。看看你想要做什麼你的代碼也很有幫助 –

回答

1

在您的maxVal0函數中,您將返回fastMaxVal函數本身,而不是其調用結果。

我想應該是這樣的:

def maxVal0(w, v, i, aW): 
    m = {} 
    return fastMaxVal(w, v, i, aW) 

此外,您fastMaxVal使用m,但它不是在它的範圍。

0
def fastMaxVal(w, v, i, aW, m): 
    global numCalls 
    numCalls += 1 
    try: return m[(i, aW)] 
    except KeyError: 
     if i == 0: 
      if w[i] <= aW: 
       m[(i, aW)] = v[i] 
       return v[i] 
      else: 
       m[(i, aW)] = 0 
       return 0 
     without_i = fastMaxVal(w, v, i-1, aW, m) 
     if w[i] > aW: 
      m[(i, aW)] = without_i 
      return without_i 
     else: 
      with_i = v[i] + fastMaxVal(w, v, i-1, aW - w[i], m) 
     res = max(with_i, without_i) 
     m[(i, aW)] = res 
     return res 

def maxVal0(w, v, i, aW): 
    m = {} 
    return fastMaxVal(w, v, i, aW, m) 

weights = [1, 1, 5, 5, 3, 3, 4, 4] 
vals = [15, 15, 10, 10, 9, 9, 5, 5] 
numCalls = 0 
res = maxVal0(weights, vals, len(vals) - 1, 8) 
print ('max Val =', res, 'number of calls =', numCalls) 

我把上面的權利。我附帶如下結果。

最大的Val = 48呼叫數量= 50