力扣第1049题 最后一块石头的重量Il c++ 动态规划(01背包)

题目

1049. 最后一块石头的重量 II

中等

相关标签

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x

最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0

示例 1:

输入:stones = [2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。

示例 2:

输入:stones = [31,26,33,21,40]
输出:5

提示:

  • 1 <= stones.length <= 30
  • 1 <= stones[i] <= 100

思路和解题方法

使用了 0-1 背包问题的思想,通过动态规划的方式求解。

具体思路如下:

  1. 首先,计算所有石头的总重量 sum
  2. 然后,将问题转化为将石头分成两堆,使得两堆的重量尽可能接近 sum/2
  3. 创建一个大小为 15001 的动态规划数组 dp,用于记录容量为 j 的背包所能装载的最大重量。
  4. 使用双重循环遍历石头数组 stones 和背包容量 j,进行动态规划的状态转移。
  5. 在每次状态转移时,比较当前背包容量 j 能够装载的最大重量 dp[j] 和将当前石头放入背包后所能得到的重量 dp[j - stones[i]] + stones[i],取较大值更新 dp[j]
  6. 最后,返回两堆石头的重量差值,即 sum - dp[target] - dp[target]

复杂度

        时间复杂度:

                O(n*m)

        时间复杂度为 O(n * m)。

其中 n 是石头的数量,m 是石头总重量的一半。这是因为代码中使用了两层循环,外层循环遍历石头数组,内层循环遍历背包容量。对于每个背包容量,都需要进行一次状态转移操作,因此总共需要进行 n * m 次状态转移。

        空间复杂度

                O(m)

        空间复杂度为 O(m)。

        其中 m 是石头总重量的一半。这是因为代码中创建了一个大小为 15001 的动态规划数组 dp,用于记录不同背包容量下的最大重量。由于背包容量的最大值为石头总重量的一半,因此数组 dp 的大小为 m+1,即 15001。因此,所需的额外空间随着石头总重量的增加而增加,但是与石头的数量无关。

需要注意的是,代码中使用了一个固定大小的动态规划数组 dp,这是因为题目给定了石头的最大数量为 30,每块石头的重量最大为 100。根据题目的限制条件,可以确定石头总重量的上限为 3000,因此背包容量的上限为 1500。为了保证数组 dp 能够覆盖所有可能的背包容量,将其大小设置为 15001。如果题目的限制条件发生变化,可能需要调整数组 dp 的大小以适应新的情况。

c++ 代码

int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0); // 创建一个大小为 15001 的动态规划数组 dp,初始值都为 0int sum = 0; // 计算所有石头的总重量for (int i = 0; i < stones.size(); i++) {sum += stones[i];}int target = sum / 2; // 目标是将石头分为两堆,使得两堆的重量尽可能接近 sum/2for (int i = 0; i < stones.size(); i++) {for (int j = target; j >= stones[i]; j--) {// 动态规划的核心逻辑// dp[j] 表示容量为 j 的背包所能装载的最大重量// dp[j-stones[i]]+stones[i] 表示将当前石头放入容量为 j 的背包中所能得到的重量dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);}}return sum - dp[target] - dp[target]; // 返回两堆石头的重量差值
}

简洁写法(使用库函数做加法)

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001,0);int sum = accumulate(stones.begin(), stones.end(), 0);int target = sum/2;for(int i = 0;i<stones.size();i++)for(int j = target;j>=stones[i];j--)dp[j] = max(dp[j],dp[j-stones[i]]+stones[i]);return sum - dp[target] - dp[target];}
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络工程师应知应会:基础知识(5)

一、防火墙区域结构 防火墙按安全级别不同&#xff0c;可划分为内网、外网和 DMZ 区。 (1) 内网。 内网是防火墙的重点保护区域&#xff0c;包含单位网络内部的所有网络设备和主机。该区域是可信的&#xff0c;内网发出的连接较少进行过滤和审计。 (2) 外网。 外网是防火墙重…

面试算法51:节点值之和最大的路径

题目 在二叉树中将路径定义为顺着节点之间的连接从任意一个节点开始到达任意一个节点所经过的所有节点。路径中至少包含一个节点&#xff0c;不一定经过二叉树的根节点&#xff0c;也不一定经过叶节点。给定非空的一棵二叉树&#xff0c;请求出二叉树所有路径上节点值之和的最…

9.Vue前端使用iframe集成帆软报表的单点登录

一、背景 需要把帆软报表内嵌到若依里面来。 二、帆软设置 2.1 帆软报表的url 打开帆软后端里面的【目录管理】查看具体报表的url 帆软报表的具体地址为: Frm聚合报表地址: 【帆软的服务http】+【/webroot/decision/view/form?viewlet=demo/demo.frm】 CPT普通报表的地…

查询和下载“省市县乡村“五级行政区划

背景信息 在更新完CTAmap1.12版本之后&#xff0c;我想继续完善这个系列的数据&#xff0c;把时间范围往前更新是基础&#xff0c;但如何展现多年的数据是个值得解决的问题。 如何展现多个年份的行政区划&#xff1f;我的思考是用思维导图的形式&#xff0c;简单明了。既然要…

WSL1 安装 debian xfce 用xrdp 导入远程桌面

凑合能用 晃晃行 晃晃不行 而且比较卡 还经常报崩溃 sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils apt install locales -y 安装过完应该会提示设置locales&#xff0c;如果安装完之后想要更改相关设置&#xff0c;可以使用如下命令重新设置loca…

Github 自动化部署到GitHub Pages

1.准备工作 新建仓库 新建项目 配置 vite.config.ts base: ./,部署应用包时的基本URL&#xff0c;例&#xff1a;vue-cli 5.x 配置 publicPath 推送到远程仓库 2.配置 GitHub Token 点击 Settings -> Actions -> General 找到 Workflow permissions&#xff0c;选中第…

【java学习—十】操作集合的工具类Collections(8)

文章目录 1. 操作集合的工具类&#xff1a; Collections2. 应用3. 查找、替换3.1. max 与 min3.2. 根据Comparator返回max(min) 3.3. frequency 与 replaceAll4. 同步控制 1. 操作集合的工具类&#xff1a; Collections Collections 是一个操作 Set 、List 和 Map 等集合的工具…

Spring XML使用CASE WHEN处理SELECT字段

在日常开发中&#xff0c;经常会碰到需要导出的情况。而一些枚举值或者状态一般是定义成整型&#xff0c;这个时候需要对数据进行转换&#xff0c;转换成对应的文本再导出。 在XML中用CASE WHEN来根据不同的查询结果做不同的处理。 比如 SELECT name AS 姓名, age AS 年龄 C…

红黑树——插入底层实现【C++】面试重灾区!!

目录 前言 一&#xff0c;概念 定义 二&#xff0c;insert 情况一&#xff1a; 情况二&#xff1a; 情况三&#xff1a; insert代码 三&#xff0c; 红黑树验证(面试题) 产生随机数验证 每日一图区&#xff1a; 前言 AVL树是一棵绝对平衡的二叉搜索树&#xff0c;其…

shell script中的数值运算declare和$((运算式 ))

linux中变量定义默认是字符串类型&#xff0c;如要进行数值运算&#xff0c;需要先声明变量类型&#xff0c;或者通过固定格式来计算 看案例 如果不通过固定格式&#xff0c;直接 echo 55 如图&#xff0c;结果显示的55本身 可以写成 declare -i var#声明变量integrate类型&…

ref、reactive、toRef、toRefs

ref 作用&#xff1a;定义一个响应式数据 语法&#xff1a;const xxx ref(initValue) 创建一个包含响应式数据的引用对象 js中操作数据&#xff1a;xxx.value 模板中读取数据&#xff1a;不需要.value,直接<div>{{xxx}}</div> 接收的数据&#xff1a;基本类型、对…

【aspose之三】【springboot】java使用aspose.html 的cloud版html转pdf,html2pdf

前言 把url网页或本地文件html转换pdf 一、html转pdf 一&#xff09;代码实现 1.maven配置 <dependency><groupId>com.aspose</groupId><artifactId>aspose-html-cloud</artifactId><version>22.12.1</version></dependency>…

计算机视觉 计算机视觉识别是什么?

计算机视觉识别&#xff08;Computer Vision Recognition&#xff09;是计算机科学和人工智能领域中的一个重要分支&#xff0c;它致力于使计算机系统能够模拟和理解人类视觉的过程&#xff0c;从而能够自动识别、分析和理解图像或视频中的内容。这一领域的发展旨在让计算机具备…

python---数据类型(列表)

组织列表 使用sort()方法对列表永久性排序 按照字母顺序排序&#xff1a; motorcycles [chunlan, yamaha, dayun, jianshe]motorcycles.sort()print(motorcycles) 字母倒序&#xff1a; motorcycles [chunlan, yamaha, dayun, jianshe]motorcycles.sort(reverseTrue)pri…

SQL server数据库定时搜索

问题现象 出现下图问题&#xff0c;导致连接该数据库的程序不能正常启动 解决办法 定时搜索数据库 脚本 # 设置数据库名称 # 设置定时任务时间# 生成定时任务执行sql文件 sql语句 USE [master] GO ALTER DATABASE volador SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DA…

软件测试:压力测试详解

压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&#xff0c;并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试&#xff0c;并评估软件在极端…

java中main方法和@Test注解的区别

Java的main方法和Test注解在用途和功能上有很大的区别。 main方法是Java应用程序的入口点。当你运行一个Java程序时&#xff0c;JVM会首先查找具有public static void main(String[] args)签名的类&#xff0c;并从这个方法开始执行程序。main方法通常用于控制程序的启动、执行…

界面控件DevExpress WPF Gauge组件 - 轻松实现个性化商业仪表盘

DevExpress WPF Gauge&#xff08;仪表&#xff09;控件包含了多种圆形仪表类型、水平和垂直线性仪表、分段和矩阵数字仪表以及状态指示器&#xff0c;同时还具有最终用户交互性的集成支持。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至…

自适应H5樱花个人网站引导页导航源码SEO增强版

懂前端和 PHP 技术想更改前端页面的可以看&#xff1a;网站的前端页面不好看&#xff0c;你可以查看 index 目录&#xff0c;内有参数 txt 文本里面记录了前端页面所使的关键 JS 代码和 php 代码&#xff0c;只需要稍加复制粘贴修改到新的前端页面就可以了&#xff01;主目录的…

驱动开发11-1 编写IIC驱动-读取温湿度数据

头文件 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define GET_HUM _IOR(m, 1, int) #define GET_TEM _IOR(m, 0, int) #endif 应用程序 si7006.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #inc…