三种写法算得一样吗
暴力、记忆化、填表三种写法,同一批物品同一个容量。运行下面这段程序:
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)
def knap1d(items, cap):
dp = [0] * (cap + 1)
for w, v in items:
for c in range(cap, w - 1, -1):
if dp[c - w] + v > dp[c]:
dp[c] = dp[c - w] + v
return dp
IT = [(1, 1), (2, 3), (1, 2), (2, 2), (1, 1),
(2, 4), (1, 3), (2, 2), (1, 1), (2, 3)]
a = knap_rec(IT, 8, {"t": 0})
b = knap_memo(IT, 8, {"t": 0})
c = knap1d(IT, 8)[8]
print(str(a) + "/" + str(b) + "/" + str(c))
全部评论