ACWing 背包相关问题 1022. 宠物小精灵之收服

'''
本质是01背包,约束条件有两个维度,价值也是有两个维度(收服的怪兽数目,剩余血量),需要把
价值映射成1维度的来比较大小进行决策


dp(i, j, k) 表示前i种怪兽在精灵球剩余j个,血量剩余k条件下的最大价值
实现的时候把第一维的空间压缩了
'''


def value(a, b):
    return a * 600 + b


N, M, K = map(int, input().split())

arr = []
for _ in range(K):
    nn, mm = map(int, input().split())
    arr.append((nn, mm))

dp = [[0 for _ in range(M + 1)] for _ in range(N + 1)]

for i in range(K):
    for j in range(N, -1, -1):
        for k in range(M, -1, -1):
            if i == 0:
                dp[j][k] = (1, k - arr[i][1]) if j >= arr[i][0] and k > arr[i][1] else (0, k)
            else:
                if j >= arr[i][0] and k > arr[i][1]:

                    nn, mm = dp[j - arr[i][0]][k - arr[i][1]]
                    if value(nn + 1, mm) > value(dp[j][k][0], dp[j][k][1]):
                        dp[j][k] = (nn + 1, mm)

print(dp[N][M][0], dp[N][M][1])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值