首页 > 编程语言 >【C++动态规划 贪心】3180. 执行操作可获得的最大总奖励 I|1848

【C++动态规划 贪心】3180. 执行操作可获得的最大总奖励 I|1848

时间:2024-11-28 17:30:16浏览次数:13  
标签:1848 int res C++ 奖励 rewardValues 3180 dp

本文涉及知识点

C++贪心
C++动态规划

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

给你一个整数数组 rewardValues,长度为 n,代表奖励的值。
最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 :
从区间 [0, n - 1] 中选择一个 未标记 的下标 i。
如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并 标记 下标 i。
以整数形式返回执行最优操作能够获得的 最大 总奖励。
示例 1:
输入:rewardValues = [1,1,3,3]
输出:4
解释:
依次标记下标 0 和 2,总奖励为 4,这是可获得的最大值。
示例 2:
输入:rewardValues = [1,6,4,3,2]
输出:11
解释:
依次标记下标 0、2 和 1。总奖励为 11,这是可获得的最大值。
提示:
1 <= rewardValues.length <= 2000
1 <= rewardValues[i] <= 2000

排序+动态规划+贪心之临项交换

我们令最优解按顺序选择的奖励为:{i1,i2 ⋯ \cdots ⋯ im},则一定是升序。如果不是,则选择非升序的相邻两项交换之,仍然是解。
我3180简称奖励数组为num,对num排序。M = num.back()

动态规划的状态表示

dp[i][m] 从num的前i个元素选择奖励,最大奖励能否是m。m ∈ \in ∈[0,2M]。

动态规划的转移方程

枚举前置状态(i,m)
dp[i+1] = dp[i] 不选择第i项奖励。
如果nums[i] >m 则,dp[i+1][m+nums[i]] ||= dp[i][m]。

动态规划的填报顺序

i从0到n-1,m从0到2M。

动态规划的初始值

dp[0][0]=true,其它全为false。

动态规划的返回值

dp.back()[m]成立的最大m。

代码

核心代码

class Solution {
		public:
			int maxTotalReward(vector<int>& rewardValues) {
				const int N = rewardValues.size();
				sort(rewardValues.begin(), rewardValues.end());
				const int M = rewardValues.back();
				vector<vector<bool>> dp(N+1, vector<bool>(M*2+1));
				dp[0][0] = true;
				for (int i = 0; i < N; i++) {
					dp[i + 1] = dp[i];
					for (int m = 0; m < rewardValues[i]; m++) {
						dp[i + 1][m + rewardValues[i]] = dp[i + 1][m + rewardValues[i]] || dp[i][m];
					}
				}
				for (int m = 2 * M; m >M; m--) {
					if (dp.back()[m]) { return m; }
				}
				return M;
			}
		};

单元测试

vector<int> rewardValues;
		TEST_METHOD(TestMethod1)
		{
			rewardValues = { 1,  3 };
			auto res = Solution().maxTotalReward(rewardValues);
			AssertEx(4, res);
		}
		TEST_METHOD(TestMethod11)
		{
			rewardValues = { 1, 1, 3, 3 };
			auto res = Solution().maxTotalReward(rewardValues);
			AssertEx(4, res);
		}
		TEST_METHOD(TestMethod12)
		{
			rewardValues = { 1,6,4,3,2 };
			auto res = Solution().maxTotalReward(rewardValues);
			AssertEx(11, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

标签:1848,int,res,C++,奖励,rewardValues,3180,dp
From: https://blog.csdn.net/he_zhidan/article/details/143372052

相关文章

  • C++_内存模型和包
    C++内存堆(heap)和栈(stack)是两种用于存储数据的内存区域 stack栈内存是由操作系统自动管理栈是一种用于存储局部变量和函数调用信息的内存区域,通常采用LIFO(后进先出)结构。 heap堆内存是用于动态分配的内存区域,通过显式地使用new和delete C语言【malloc分配空间,free......
  • 高性能C++内存映射库mio使用心得
    背景在C++编程中,高效的数据访问至关重要,而内存映射文件(MemoryMappedFiles)提供了一种强大的工具,它允许我们直接将文件内容加载到进程地址空间,从而以极高的效率进行读写操作。今天,我们要向大家推荐一个轻量级且易于使用的开源库——mio。项目介绍mio是一个头文件式的、跨平台的......
  • 简易压缩算法一种字符串压缩表示的解压(Java & Python& JS & C++ & C )
    题目描述有一种简易压缩算法:针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母其他部分保持原样不变.例如字符串aaabbccccd经过压缩变成字符串3abb4cd请您编写解压函数,根据输入的字符串,判断其是否为合法压缩过的字符串......
  • C++练级计划-> 《IO流》iostream fstream sstream详解
    如果是想全部过一遍就看完,如果想具体的了解某一个请点目录。因为有三种流的使用可能内容多 目录流是什么?C++IO流(iostream)io流的注意事项cin和cout为什么能直接识别出类型和数据fstreamfstream的使用方法: 1.以二进制打开文件并写入和读取2.以文本打开文件并读取或写......
  • 最新毕设-SpringBoot-共享自习室管理系统-20672(免费领项目)可做计算机毕业设计JAVA、PH
    摘要随着现代社会竞争压力的增加以及学习需求的提升,学生们对于高效自习场所的需求日益增长。而基于springboot的共享自习室管理系统的设计与实现将为学生提供一个便捷、高效的共享自习环境,提升学生自习效率和体验。该系统可以为学生们提供在线讲座的渠道,实现在线进行预约位置......
  • 《 C++ 点滴漫谈: 三 》穿越代码的迷雾:C++ 关键字的应用与未来
    摘要这篇博客深入探讨了C++语言中的所有关键字,涵盖了它们的作用、使用场景及其在编程中的重要性。从基础的控制流关键字到现代C++引入的关键字扩展,每个关键字都进行了详细解析。博客还展示了C++关键字的实际应用,帮助读者理解如何有效地运用它们来编写高效、清晰的代......
  • 融云IM干货丨如何确保 AAR 包中不包含 libc++_shared.so 文件?
    为了确保AAR包中不包含libc++_shared.so文件,可以采取以下几种方法:使用packagingOptions排除libc++_shared.so:在AAR包的build.gradle文件中,使用packagingOptions来排除libc++_shared.so文件。例如:gradleandroid{packagingOptions{exclude'lib/armeabi-v7......
  • 融云IM干货丨如何确保在项目中只包含一个libc++_shared.so版本?
    确保项目中只包含一个libc++_shared.so版本的关键在于统一C++运行时,并合理配置项目的构建脚本。以下是一些具体的步骤和方法:统一NDK版本:确保项目中所有模块使用的NDK版本一致,这有助于避免不同版本NDK生成的libc++_shared.so之间的冲突。可以在module级别的build.gradle文件中......
  • 小白的C++之路(一)
    作为编程小白,最近开始学习C++了。为学习C++,装了一个VScode,但是写的第一个代码就出现了问题,也是让本小白几天时间笑不出来。前前后后搜了不少文章,也搜了好些视频,总是没有解决成功,今天晚上糊里糊涂突然就成功了,特此记录一下。问题如下: 解决经历:为了解决这两个问题,真是搜了......
  • 【C++习题】16.滑动窗口_最小覆盖子串
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:76.最小覆盖子串题目描述:解法暴力解法:列出所有符合要求的字串,然后比较大小。滑动窗口+哈希表比如,如果已经符合要求了那么left右移一位的话,right需要移动吗?left指向的地方恰好有符合t的字符,-......