没看到python版本的,第一次写题解,希望对您有用。
以前: dp[i,j] 前i件物品中装一个体积为j的包,能获得的最大价值
现在:dp[i,j] 从i到最后的所有物品中装一个体积为j的包,能获得的最大价值
状态转移:dp[i, j] = max(dp[i+1, j], dp[i+1, j-v_lst[i]]+w_lst[i])
字典序:贪心选择(从上往下遍历的时候能选就选)
python 代码
(n, m) = list(map(int, input().split()))
w_lst, v_lst = [], []
# 体积:增加1是为了数值与直觉保持一致
# 物品:增加1是为了避免边界处理
dp = [[0 for _ in range(m+1)]for _ in range(n+1)]
for i in range(n):
(vi, wi) = list(map(int, input().split()))
w_lst.append(wi)
v_lst.append(vi)
# 根据递推公式知道物品要倒排
# 因为是二维数组,所以体积的顺序正反都可以
for i in range(n-1, -1, -1): # good
for j in range(1, m+1): # volumn
dp[i][j] = dp[i+1][j] # 不用处理边界
if j >= v_lst[i]:
dp[i][j] = max(dp[i][j], dp[i+1][j-v_lst[i]]+w_lst[i])
cur_v = m
res = []
for i in range(n):
if dp[i][cur_v] == dp[i+1][cur_v-v_lst[i]]+w_lst[i]:
res.append(str(i+1))
cur_v -= v_lst[i]
print(" ".join(res))
毕竟底层还是c语言 😄
话说只是简单版的for循环遍历和if判断 好像很多时候从c++代码改过来主要工作就加点
:
稍微变点赋值函数格式和动态变量类型不知道是不是