题解 | 【模板】01背包
import sys
line = sys.stdin.readline().strip()
n,V = map(int,line.split())
Mat = []
for _ in range(n):
line = sys.stdin.readline().strip()
Mat.append(list(map(int,line.split())))
dp = [[0 for i in range(V+1)] for j in range(n+1)]
for i in range(1, n+ 1):
for j in range(1, V+1):
dp[i][j] = dp[i-1][j]
vv = Mat[i - 1][0]
ww = Mat[i - 1][1]
if j < vv: continue
dp[i][j] = max(dp[i - 1][j - vv] + ww, dp[i][j])
print(dp[n][V])
# 上面是不装满, 下面是装满
dp = [[0 for i in range(V+1)] for j in range(n+1)]
for i in range(1, n+ 1):
for j in range(1, V+1):
dp[i][j] = dp[i-1][j]
vv = Mat[i - 1][0]
ww = Mat[i - 1][1]
if j < vv: continue
elif j - vv == 0:
dp[i][j] = max(dp[i - 1][j - vv] + ww, dp[i][j])
elif j - vv != 0 and dp[i - 1][j - vv] != 0:
dp[i][j] = max(dp[i - 1][j - vv] + ww, dp[i][j])
print(dp[n][V])
有几率超时,卡着过的
dp 原来01背包比无限背包复杂一点,01背包要开二维数组,用一维数组会抽象点
查看8道真题和解析