题解 | 【模板】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)

全部评论

相关推荐

06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务