力扣每日一题打卡 3180. 执行操作可获得的最大总奖励 I

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

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

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

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

这题目其实是个非常明显的背包问题,只不过是稍微改了一下的0-1背包问题,所以很明显是个动态规划(dp)题,但可惜我太久没写题目了,已经不会dp了。(不,明明是因为晚上的时候脑子不清醒转不动)

最后是稍微借助了一下题目下方的提示才写出来的。

dp嘛,能找到状态转移方程,题目就算解决一半了,所以重点在于我们的状态转移方程要怎么确定。

我们可以设计dp[i][j]=1表示我们有 i 个物品,可以获得 j 的奖励。那么,最后要求的就是dp[n-1]那一行最大的满足dp[n-1][j]=1的 j 。

那dp[i-1]怎么的值要怎么转移到dp[i]呢?如果我们不选第i个物品,那肯定dp[i]=dp[i-1]。而如果我们要选第i个物品呢?我们知道,只有手上的奖励值比rewardValues[i]

的值小的时候,我们才可以

选择

首先,因为这个题只需要求最大的总奖励,对具体选的物品编号没有要求,所以我们完全可以先排个序,而且排序之后也可以更方便进行选择。

然后,因为每次选择的奖励值必须大于你手上的奖励值,所以我们绝对不可能选择两个奖励值一样的物品,所以我们可以对输入数据进行一次去重。

相关推荐
书鸢123618 分钟前
力扣每日一题合集
java·算法·leetcode
我不会JAVA!1 小时前
排序算法(3) C++
c++·算法·排序算法
Willliam_william1 小时前
SystemC学习(3)— APB_SRAM的建模与测试
学习·算法
Gui林1 小时前
【GL07】C语言要点
c语言·算法
爱编程— 的小李2 小时前
有序序列合并(c语言)
c语言·算法
云卓SKYDROID2 小时前
无人机反步滑膜控制算法!
算法·无人机·知识科普·云卓科技·反步滑膜控制算法
云卓科技2 小时前
无人机之自动控制原理篇
科技·算法·目标检测·机器人·无人机
云卓科技2 小时前
无人机之集群控制方法篇
科技·算法·无人机·交互·制造
混迹网络的权某2 小时前
每天一道C语言精选编程题之求数字的每⼀位之和
c语言·开发语言·考研·算法·改行学it·1024程序员节
Curry_Math2 小时前
LeetCode 热题 100之链表3
算法·leetcode·链表