当前位置: 首页 > news >正文

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

1049. 最后一块石头的重量 II - 力扣(LeetCode)

有一堆石头,用整数数组 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

  

【思路】尽量把这些石头分成重量总和近似相等的两堆。分成数值近似相等的两个集合,也就是这里边的两堆石头。尽量凑成,凑不成也没关系。凑不成的话那两堆石头相撞的话,所剩的重量它也一定是最小的。那此时这就是一个背包问题,每一个物品只能用一次,所以说这就是一个0-1背包。

本题和 LeetCode 416.分割等和子集几乎就是一样的, 唯一的区别就是在最后判断的时候,是有一点出入的。

  • 在0-1背包中的dp[j]

dp[j]        背包容量j           最大价值dp[j]

                                          最大重量dp[j]

dp[j] = max(dp[j],dp[j-weight[i]] + value[j]);

由于在本题中,价值和重量相等,

dp[j] = max(dp[j],dp[j-stones[i]] + stones[i]);

  1. 可以求出一堆石头的重量,也就是 dp[target];
  2. 也就可以求出另一堆石头的重量,也就是 sum - dp[target]
  3. 然后这两堆石头进行碰撞:(sum - dp[target]) - dp[target]  
class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum = 0;for(int i=0;i<stones.size();i++) {sum += stones[i];}int target = sum / 2;vector<int> dp(target+1,0);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];}
};// stones = [2,7,4,1,8,1]
// 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y// 2 7 4 1 8 1// 思路:尽量分成重量差不多的两堆,然后再进行相减
// 思考:那如何分成这样的两堆呢?// 1.dp[j]
// dp[j]中的j表示容量,那么最大容量(重量)是多少呢,就是所有石头的重量和// 2.确定target
// 2 + 7 + 4 + 1 + 8 + 1 = 23
// target = sum / 2 = 23/2 = 11;
// {2,7,1,1} {4,8}
// 11 - 10 = 1// ① dp[target];
// ② sum - dp[target]
// ③ (sum - dp[target]) - dp[target] // 3.动态递归方程
// dp[j] = max(dp[j],dp[j-stones[i]] + stones[i]);// 4.初始化dp
// dp[0] = 0
// 一维数组dp初始化为0
// vector<int> dp(target+1,0);// 5.遍历
// 先遍历物品,再从后往前遍历背包//         价值      重量
// 物品0     2        2    
// 物品1     7        7
// 物品2     4        4
// 物品3     1        1
// 物品4     8        8
// 物品5     1        1// 0 1 2 3 4 5 6 7 8 9 10 11 背包重量j
// | | | | | | | | | |  |  |
// 0 0 0 0 0 0 0 0 0 0  0  0  初始化dp
// 0 0 2 2 2 2 2 2 2 2  2  2  (可挑选物品0)->产生最大价值
// 0 0 2 2 2 2 2 7 7 9  9  9  (可挑选物品0、物品1)->产生最大价值
// 0 0 2 2 4 4 6 7 7 9  9  11 (可挑选物品0、物品1、物品2)->产生最大价值
// 0 1 2 3 4 5 6 7 8 9  10 11 (可挑选物品0、物品1、物品2、物品3)->产生最大价值
// 0 1 2 3 4 5 6 7 8 9  10 11 (可挑选物品0、物品1、物品2、物品3、物品4)->产生最大价值
// 0 1 2 3 4 5 6 7 8 9  10 11 (可挑选物品0、物品1、物品2、物品3、物品4、物品5)->产生最大价值

来自代码随想录的课堂截图

>>往期文章:

解决0-1背包问题(方案一):二维dp数组_呵呵哒( ̄▽ ̄)"的博客-CSDN博客

解决0-1背包问题(方案二):一维dp数组(滚动数组)_呵呵哒( ̄▽ ̄)"的博客-CSDN博客

相关文章:

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

1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&am…...

Golang中的类型转换介绍

Golang中存在4种类型转换&#xff0c;分别是&#xff1a;断言、显式、隐式、强制。下面我将一一介绍每种转换使用场景和方法 一、断言类型转换 主要是判断变量是否可以转换成某一类型。断言主要用于变量是interface{}类型&#xff08;接口类型&#xff09;的情况&#xff0c;…...

本人碰到的RN项目的坑

1.路径问题 路径不能含有中文 2.下载jar\aar包超时问题 手动下载:任意位置新建个文件夹,然后点击超时的jar包链接跳转到浏览器后下载到这个文件夹内,返回报错的地方找到报错的包名(com或者org开头的),然后去这个路径下找到对应的包名 C:\Users\22560\.gradle\caches\module…...

EcmaScript标准-导入与导出-js

ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会&#xff0c;European Computer Manufacturers Association&#xff09;通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛&#xff0c;它往往被称为JavaScript或JScript&#xff0c;所以它…...

如何将matlab中的mat矩阵文件在python中读取出来

先安装hdf5storage这个包 pip3 install hdf5storage 然后在当前目录下放入要读取的mat文件 # 将matlab中的mat文件读取出来 import hdf5storagedata hdf5storage.loadmat(inputWeights.mat) print(data[inputWeights])...

解释C语言中 6.18f (浮点数常量后缀)

在C语言中&#xff0c;例如6.18f &#xff0c;这是一个浮点数常量。 6.18 是一个浮点数&#xff0c;而后缀 f 表示该浮点数是单精度浮点数。 在C语言中&#xff0c;默认的浮点数常量类型是双精度浮点数&#xff0c;如果希望使用单精度浮点数&#xff0c;可以在常量后面加上 f…...

Pandas 2.1中的新改进和新功能

大家好&#xff0c;Pandas 2.1于2023年8月30日发布&#xff0c;跟随本文一起看看这个版本引入了哪些新内容&#xff0c;以及它如何帮助用户改进Pandas的工作负载&#xff0c;包含了一系列改进和一组新的弃用功能。 Pandas 2.1在Pandas 2.0中引入的PyArrow集成基础上进行了大量…...

c#static(静态)关键字

在C#中&#xff0c;static关键字有多种用途&#xff0c;可以用于声明静态成员、静态类和静态方法。 静态成员&#xff1a;使用static关键字声明的成员属于类&#xff0c;而不是类的实例。静态成员在类第一次被使用之前就被初始化&#xff0c;且只有一个副本存在于内存中&#x…...

GitHub配置SSH key

GitHub配置SSH key Git配置信息并生成密钥 设置用户名和密码 设置用户名 git config --global user.name "用户名" 设置邮箱 git confir --global user.email "邮箱" 生成密钥 ssh-keygen -t rsa -C "邮箱" 查看密钥 到密钥所保存的位置 复…...

文件审计及文件完整性监控

什么是文件审核 对文件服务器中发生的所有事件的检查称为文件审核。这包括监视文件访问&#xff0c;其中包含谁访问了什么文件、何时以及从何处访问的详细信息;对访问最多和修改的文件的分析;成功和失败的文件访问尝试;等等。文件服务器审核过程的主要目标是跟踪在配置的服务器…...

华为智能企业远程办公安全解决方案(1)

华为智能企业远程办公安全解决方案&#xff08;1&#xff09; 课程地址方案背景需求分析企业远程办公业务概述企业远程办公安全风险分析企业远程办公环境搭建需求分析 方案设计组网架构设备选型方案亮点 课程地址 本方案相关课程资源已在华为O3社区发布&#xff0c;可按照以下…...

k8s中常用命令总结

文章目录 进入pod容器的命令pod中只有1个用户容器pod中只有2个&#xff08;含&#xff09;以上用户容器 yaml中的字段不清楚后面跟什么&#xff0c;通过explain来查看查看pod内指定容器的日志Pod内各个容器的服务端口不能相同资源对象的创建方式一方式二 查看pod的详细信息查看…...

Logistic map混沌掩盖信号

开学接触了一些有关混沌知识的学习&#xff0c;阅读量一些混沌通信的论文&#xff0c;对于混沌掩盖信号以确保加密通信有一定的兴趣。混沌的产生我选用的是logistic map映射产生混沌&#xff0c;主要就是一个递推公式&#xff1a; 对于这样一个式子&#xff0c;可以看出&#x…...

外包干了2个月,技术有明显退步...

先说一下自己的情况&#xff0c;本科生&#xff0c;18年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!可我已经在一个企业干了3年的功能测试&…...

顺序表和链表

顺序表和链表 一.线性表二.顺序表三.链表链表的分类单链表的实现双链表的实现 四.顺序表和链表的区别和联系 一.线性表 常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线&#xff0c;但是在物理结构上并不…...

k8s--架构基础--云控制器管理器

具体来说&#xff0c;云控制器管理器允许用户将集群与云服务提供商的 API 进行连接&#xff0c;以获取与云平台相关的信息和资源。通过这种连接&#xff0c;Kubernetes 可以利用云服务提供商的功能和特性&#xff0c;例如虚拟机、负载均衡器、对象存储等。与此同时&#xff0c;…...

OpenAI 更新 ChatGPT:支持图片和语音输入【附点评】

一、消息正文 9月25日消息,近日OpenAI宣布其对话AI系统ChatGPT进行升级,添加了语音输入和图像处理两个新功能。据OpenAI透露,这些新功能将在未来两周内面向ChatGPT Plus付费用户推出,免费用户也将很快可以使用这些新功能。这标志着ChatGPT继续朝着多模态交互的方向发展,为用户提…...

数据结构:堆的简单介绍

目录 堆的介绍:(PriorityQueue) 大根堆:根节点比左右孩子节点大 小根堆:根节点比左右孩子节点小 堆的存储结构: 为什么二叉树在逻辑上用满二叉树结构,而不是普通二叉树呢? 因为如果是普通二叉树会造成资源的浪费​编辑 堆的介绍:(PriorityQueue) 堆又称优先级队列,何为优先…...

【LeetCode-中等题】654.最大二叉树

文章目录 题目方法一&#xff1a;递归 题目 方法一&#xff1a;递归 class Solution {int[] num null; public TreeNode constructMaximumBinaryTree(int[] nums) {num nums;return myTree(0,num.length-1);}public TreeNode myTree( int begin , int end){if(begin > end…...

基于微信小程序的刷题考试系统设计与实现(适用于各类考试类、答题类程序)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...