3180. 执行操作可获得的最大总奖励 I

问题描述:

给你一个整数数组 rewardValues,长度为 n,代表奖励的值。

最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 

  • 从区间 [0, n - 1] 中选择一个 未标记 的下标 i
  • 如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并 标记 下标 i

以整数形式返回执行最优操作能够获得的 最大 总奖励。

解题思路:

1. 排序:首先对数组rewardValues进行排序。
2. 动态规划:定义一个动态规划数组dp,其中dp[i]表示是否能通过选择数组中的某些元素得到总奖励i。
3. 状态转移:对于每个rewardValues[i],更新dp数组,表示通过选择当前元素能够达到的总奖励。
4. 结果计算:从最大可能的总奖励开始向下遍历dp数组,找到第一个为True的索引,该索引加上数组中的最大值即为最大总奖励。

参考代码:

class Solution(object):
    def maxTotalReward(self, rewardValues):
        """
        :type rewardValues: List[int]
        :rtype: int
        """
        # 对奖励值进行排序
        rewardValues.sort()
        m = rewardValues[-1]  # 找到最大的奖励值
        dp = [0] * (2 * m)  # 初始化动态规划数组
        dp[0] = 1

        # 遍历每个奖励值,更新 dp 数组
        for x in rewardValues:
            for k in range(2 * x - 1, x - 1, -1):  # 从后向前遍历
                if dp[k - x] == 1:  # 如果可以实现 k - x 的总奖励
                    dp[k] = 1  # 则可以实现 k 的总奖励

        # 查找最大可实现的总奖励
        res = 0
        for i in range(len(dp)):
            if dp[i] == 1:
                res = i  # 更新最大值

        return res  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值