暴力和记忆化各调了多少次
十件小物品、容量 8。一边纯暴力递归,一边加上记忆化。运行下面这段程序:
def knap_rec(items, cap, st):
def go(i, c):
st["t"] += 1
if i == len(items):
return 0
w, v = items[i]
best = go(i + 1, c)
if c >= w:
take = go(i + 1, c - w) + v
if take > best:
best = take
return best
return go(0, cap)
def knap_memo(items, cap, st):
memo = {}
def go(i, c):
st["t"] += 1
if (i, c) in memo:
return memo[(i, c)]
if i == len(items):
return 0
w, v = items[i]
best = go(i + 1, c)
if c >= w:
take = go(i + 1, c - w) + v
if take > best:
best = take
memo[(i, c)] = best
return best
return go(0, cap)
IT = [(1, 1), (2, 3), (1, 2), (2, 2), (1, 1),
(2, 4), (1, 3), (2, 2), (1, 1), (2, 3)]
a = {"t": 0}
knap_rec(IT, 8, a)
b = {"t": 0}
knap_memo(IT, 8, b)
print(str(a["t"]) + "/" + str(b["t"]))
全部评论