AcWing 背包相关问题 3. 完全背包问题

'''
完全背包实现,优化解法,时间复杂度是O(N^2)

状态转移
dp(i, j)表示前i个物品在容量是j的情况下的最大总价值

cost[i] 表示物品开销
val[i] 表示物品价值

dp(i, j) = max ( dp(i-1, j), dp(i, j-cost[i]) + val[i] )


'''

n, v = map(int, input().split())

arr = []
for _ in range(n):
    a, b = map(int, input().split())
    arr.append((a, b))

# arr.sort() # 是否排序似乎影响不是很大
dp = [0] * (v + 1)
for i in range(n):
    for j in range(v + 1):
        if i == 0:
            dp[j] = (j // arr[i][0]) * arr[i][1]
        else:
            # 此时dp[j] 表示的是前i-1个物品在容量为j的条件下的最大总价值,其实就是第i个物品选0个情况下的dp(i, j)的以第一个候选值

            # 下面第i个物品拿掉一个就行了,不用枚举拿多个的不同情况
            if j >= arr[i][0]:
                # 前i个物品总容量是dp[j], dp[j-arr[i][0]]情况下的最大价值和再加上单独个拿掉的那个i物品的价值
                dp[j] = max(dp[j], dp[j - arr[i][0]] + arr[i][1])

print(dp[v])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值