序言
对于下面的每一个问题我都会附上一个博客链接,这是我觉得讲的比较的清楚的博客,
而我自己的理解全都在代码的注释中,建议先看理论博客,再看代码中的注释,你会有意想不到的收获。
01背包
最优的解法:一维动态规划
相关博客:
01背包
while True:
try:
N, V = list(map(int, input().split()))
dp = [0]*(V+1)
for _ in range(N): # 遍历所有的物品
v, w = list(map(int, input().split()))
# 对于二维的动态规划,求解第i行时只用到了上一行的结果,所以二维可以压缩成一维
# 再仔细分析一下,求解dp[i][j]时只用到它的上一格dp[i-1][j]和dp[i-1][j-v](上一格的前面某个格子),
# 在一维中(把二维的行去掉只保留列,就变成一维)就是求解dp[j]会
# 用到dp[j](此时就是它的上一格)和dp[j-v](上一格的前面某个格子), 所以我们要从右往左修改一维bp,
# 因为在从左往右的时候如果你修改了dp[j],那么在求解dp[j+v]用到dp[j]就已经成了脏数据,dp[j]对dp[j+v]来说
# 应该是上一行的内容,而这里却已经是当前行的内容了。
for j in range(V, 0, -1): # 遍历所有容量的背包,注意是逆序
if j >= v:
dp[j] = max(dp[j],