问题描述:
给你一个整数数组 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