主要思路是利用dp找到0-V中每个大小的背包放满可以得到的最大价值。整个背包可放的最大价值就是dp的最大值。dp的最后一个数dp[v]就是放满V大小的背包的最大价值的值。如果没有最大值就输出初始化时候的0,满足输出要求

while True:
    try:
        n, V = map(int, input().split())
        lv, lw = [], []
        for i in range(n):
            l = list(map(int, input().split()))
            lv.append(l[0])  # 物品重量列表
            lw.append(l[1])  # 物品价值列表
        # 2 双结果dp[j]
        dp = [0 for _ in range(V + 1)] # dp[j]表示背包容量为j时装满背包的最大价值。最终输出时,问题1的答案是整个dp的最大值,问题2的答案是dp的最后一个数,初始化时数字是0所以最后如果的不到结果也满足答案要求。
        for i in range(n):
            for j in range(V, -1, -1):  # 从后向前算,防止数据混淆
                if lv[i] <= V and(j == lv[i] or (dp[j - lv[i]] != 0 and j - lv[i] > 0)):  # 条件首先剔除无法放入背包的物品。然后如果新加入的物品可以单独放入某一个j、或者与已存在的值可以组成j的值进行计算。由于Python的特性dp需剔除负坐标j - lv[i] > 0
                    dp[j] = max(dp[j], dp[j - lv[i]] + lw[i])  # dp[j]的值只与其当前值、能与lv[i]重量组合成j重量的dp[j - lv[i]],两个数中的较大值
        print(max(dp))
        print(dp[-1])
    except:
        break