三种写法算得一样吗

👁️ 0 人浏览 💬 0 人评论 ❤️ 添加收藏

暴力、记忆化、填表三种写法,同一批物品同一个容量。运行下面这段程序:

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))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论