题解 | 【模板】01背包 Python3

【模板】01背包

https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e

import sys
# 0/1背包
# 动态规划,dp1[i][j]为考虑到第i个物品,容量为j的背包的最大价值,不考虑背包是否装满
# dp2[i][j] 考虑装满的情况下
# dp[i][j] = max(dp[i][j-v]+w,dp[i-1][j])
# dp1 和 dp2主要是初始化条件不同和一些遍历逻辑
# dp2要考虑到完全背包,比如主要结果dp2[i][j]是表示考虑到所有所有物品后完全背包的最大价值
# 那么 dp2[i][j] = max(dp2[i][j-v]+w,dp2[i-1][j]), 但是可能dp2[i][j-v]并没有一个完全背包解,因此需要有一个值来表征,用一个很小的值

min_w = - 1000 * 1000 - 1

n, V = list(map(int, input().strip().split()))

data = []

for i in range(n):
    v, w = list(map(int, input().strip().split()))
    data.append([v,w])

dp1 = [[0]*(V+1) for _ in range(n+1)]
dp2 = [[min_w]*(V+1) for _ in range(n+1)]
for i in range(n+1):
    dp2[i][0] = 0
# dp2以min_w初始化表征不可达状态,只有dp2[i][0]为0,表示体积完全占用

# 因为只和当前行计算只和上一行有关系,其实一维dp也行

for i in range(1,n+1):
    v, w = data[i-1]
    for j in range(1,V+1):
        if j < v:
            dp1[i][j] = dp1[i-1][j]
        else:
            dp1[i][j] = max(dp1[i-1][j-v]+w, dp1[i-1][j])



for i in range(1,n+1):
    v, w = data[i-1]
    for j in range(1,V+1):
        if j < v:
            dp2[i][j] = dp2[i-1][j]
        else:
            dp2[i][j] = max(dp2[i-1][j-v]+w, dp2[i-1][j])

print(dp1[-1][-1])
print(dp2[-1][-1] if dp2[-1][-1]>=1 else 0)

全部评论

相关推荐

2024-12-07 21:21
东北大学 Java
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务