代码随想录第43天|1049.最后一块石头的重量II 494. 目标和

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

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

代码随想录 (programmercarl.com)

动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili

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

把石头尽量分成数值相等的两堆,相减的值才会最小。

本题物品的重量为stones[i],物品的价值也为stones[i]。

动规五部曲:

1、确定dp数组以及下标的含义:dp[j] 表示容量为j的背包,可以背的最大重量为dp[j];

2、确定递推公式:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);

3、dp数组如何初始化:初始化一个长度为target+1的整形dp,用来存储动态规划中的结果:

 int[] dp = new int[target + 1];

4、确定遍历顺序:物品遍历的for循环在外,循环背包的for循环在内:

for (int i = 0; i < stones.length; i++) {// 内层循环从 target 开始,递减到 stones[i],采用倒序的方式。for (int j = target; j >= stones[i]; j--) {// 动态规划的状态转移方程,计算两种情况下的最大值:放入当前石头和不放入当前石头。dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);}}

5、举例推导dp数组:

输入[2,4,1,1], 此时target=4:

综合代码:

class Solution {// 定义一个公共方法,名称为 lastStoneWeightII,接受一个整型数组 stones,并返回一个整数。public int lastStoneWeightII(int[] stones) {// 初始化一个变量 sum,用于存储 stones 数组中所有元素的总和。int sum = 0;// 遍历 stones 数组,将所有元素的值累加到 sum 中。for (int i : stones) {sum += i;}// 将 sum 的值除以 2,并将结果赋给变量 target。int target = sum >> 1;// 初始化一个长度为 target + 1 的整型数组 dp,用于存储动态规划中的结果。int[] dp = new int[target + 1];// 使用两层循环来进行动态规划计算。for (int i = 0; i < stones.length; i++) {// 内层循环从 target 开始,递减到 stones[i],采用倒序的方式。for (int j = target; j >= stones[i]; j--) {// 动态规划的状态转移方程,计算两种情况下的最大值:放入当前石头和不放入当前石头。dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);}}// 返回 stones 中所有元素的总和减去 2 倍的 dp[target]。return sum - 2 * dp[target];}
}

 494. 目标和

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

代码随想录 (programmercarl.com)

动态规划之背包问题,装满背包有多少种方法?| LeetCode:494.目标和_哔哩哔哩_bilibili

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

 假设加法对应的总共和为x,那么减法对应的总和就是sum-x; 所以 x-(sum-x)=target;

x=(sum+target)/2; 此时就转化为:装满容量为x的背包,有几种方法。

之前遇到的都是01背包问题,在01背包问题中,物品都只能使用一次;而本题是装满有几种方法,是组合问题。

动规五部曲

1、确定dp数组以及下标的含义:dp[j] 表示:填满j这么大容量的包,有dp[j]种方法;

2、确定递推公式:

dp[j] += dp[j - nums[i]]

3、dp数组如何初始化:dp[0]=1;

4、确定遍历顺序:nums外循环,target内循环;

5、举例推导dp数组:

输入:nums: [1, 1, 1, 1, 1], S: 3

bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4

dp数组状态变化如下:

综合代码:

class Solution {// 定义一个公共方法,名称为 findTargetSumWays,接受一个整型数组 nums 和一个整数 target,并返回一个整数。public int findTargetSumWays(int[] nums, int target) {// 初始化一个变量 sum,用于存储 nums 数组中所有元素的总和。int sum = 0;for (int i = 0; i < nums.length; i++) sum += nums[i];// 如果 target 的绝对值大于 sum,那么是没有方案的,直接返回 0。if (Math.abs(target) > sum) return 0;// 如果 (target + sum) 除以 2 的余数不为 0,也是没有方案的,直接返回 0。if ((target + sum) % 2 == 1) return 0;// 计算背包的大小,即 (target + sum) 除以 2,这是动态规划的一个关键参数。int bagSize = (target + sum) / 2;// 初始化一个长度为 bagSize + 1 的整型数组 dp,用于存储动态规划中的结果。int[] dp = new int[bagSize + 1];// 初始时,背包容量为 0 的情况有一种方案,因此 dp[0] 初始化为 1。dp[0] = 1;// 使用两层循环进行动态规划计算。for (int i = 0; i < nums.length; i++) {// 内层循环从 bagSize 开始递减到 nums[i],采用倒序的方式。for (int j = bagSize; j >= nums[i]; j--) {// 动态规划的状态转移方程,计算两种情况下的方案数:放入当前元素和不放入当前元素。dp[j] += dp[j - nums[i]];}}// 返回背包容量为 bagSize 时的方案数。return dp[bagSize];}
}

 

 

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

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

相关文章

AI-数学-高中-39空间向量-2空间向量法(法向量)

原作者视频&#xff1a;【空间向量】【一数辞典】2空间向量法&#xff08;重要&#xff09;_哔哩哔哩_bilibili 法向量&#xff08;高中阶段所有与面的关系&#xff0c;都可以通过法向量去证明和解答&#xff09;&#xff1a; 是空间解析几何的一个概念&#xff0c;垂直于平面…

京东商品详情数据采集API接口|附京东商品数据返回PHP多语言高并发

京东获得JD商品详情 API 返回值说明 item_get-获得JD商品详情 API测试 注册开通 jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址…

AI时代,操作系统交互的革命性变革

AI时代对操作系统交互的影响 对于2024年的智能手机厂商们来说&#xff0c;在冲击高端市场的路上有一场绝对输不起的硬仗&#xff0c;那就是AI大模型的落地之战。 OpenAI的ChatGPT引爆了全球AIGC&#xff08;生成式人工智能&#xff09;热潮&#xff0c;短短一年时间里&#xff…

新手小白,在数学建模的过程中应该怎么分工?

大家知道&#xff0c;数学建模竞赛是需要一个团队的三个人在三天或四天的时间内&#xff0c;完成模型建立&#xff0c;编程实现和论文写作的任务&#xff0c;对许多第一次参加建模或者建模经验比较欠缺的团队来说&#xff0c;是时间紧任务重的&#xff0c;那么怎么办呢&#xf…

Java学习笔记26(枚举和注解)

1.枚举和注解 1.1 枚举 ​ 1.枚举(enumeration) ​ 2.枚举是一组常量的集合 ​ 3.枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 1.枚举应用案例 ​ 1.不需要提供setXxx方法&#xff0c;因为枚举对象值通常为只读 ​ 2.对枚举对象/属性使用final st…

C语言实现三子棋游戏(可以改变为四子棋或者多子棋版)

目录 游戏介绍 游戏框架 游戏基本逻辑的介绍 游戏具体功能实现 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 行和列&#xff1a; 对角线&#xff1a; 平局&#xff1a; 游戏继续&#xff1a; 游戏完整代码 test.c game.c game.h 游戏介绍 三子棋游戏或者…

浏览器不兼容的问题和通用解决方案

大家好&#xff0c;我是咕噜铁蛋&#xff0c;今天我想和大家聊聊一个在我们日常上网过程中经常遇到的问题——浏览器不兼容。这个问题看似微小&#xff0c;但却常常让我们在浏览网页、使用在线应用时感到困扰。接下来&#xff0c;我将详细分析浏览器不兼容的原因&#xff0c;并…

[lesson48]同名覆盖引发的问题

同名覆盖引发的问题 父子间的赋值兼容 子类对象可以当做父类对象使用(兼容性) 子类对象可以直接赋值给父类对象(<font color>兼容性)子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 当使用父类指针(引用)指向子类对象时 子类…

30 消息队列

原理 操作系统可以通过页表映射在共享区创建一块共享内存&#xff0c;也可以申请一个队列。A进程和B进程可以向这个队列发送数据块&#xff0c;两个进程接收数据块来通信 函数 申请数据块 参数中的key来自于ftok函数 删除消息队列 同样消息队列也有数据结构管理&#xff…

数值分析复习:Richardson外推和Romberg算法

文章目录 Richardson外推Romberg&#xff08;龙贝格&#xff09;算法 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 本专栏&#xff1a;数值分析复习 的前置知识主要有&#xff1a;数学分析、高等代数、泛函分析 本节继续考虑数值积分问题 Richardson外推 命题&a…

解决在linux中执行tailscale up却不弹出验证网址【Tailscale】【Linux】

文章目录 问题解决提醒 问题 最近有远程办公需求&#xff0c;需要连接内网服务器&#xff0c;又不太想用todesk&#xff0c;于是找到一个安全免费可用的Tailscale Best VPN Service for Secure Networks&#xff0c;在windows中顺利注册账号后&#xff0c;登陆了我的windows …

上位机图像处理和嵌入式模块部署(树莓派4b进行驱动的编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派4b上面还支持驱动代码的编写&#xff0c;这是我没有想到的。这里驱动&#xff0c;更多的是一种框架的编写&#xff0c;不一定是编写真正的驱…

20240422,C++文件操作

停电一天之后&#xff0c;今天还有什么理由不学习呜呜……还是没怎么学习 一&#xff0c;文件操作 文件操作可以将数据持久化&#xff0c;对文件操作时须包含头文件<fstream> 两种文件类型&#xff1a;文本文件&#xff1a;文件以文本的ASCII码形式存储&#xff1b;二进…

【Vue3】$subscribe订阅与反应

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

超越OpenAI,谷歌重磅发布从大模型蒸馏的编码器Gecko

引言&#xff1a;介绍文本嵌入模型的重要性和挑战 文本嵌入模型在自然语言处理&#xff08;NLP&#xff09;领域扮演着至关重要的角色。它们将文本转换为密集的向量表示&#xff0c;使得语义相似的文本在嵌入空间中彼此靠近。这些嵌入被广泛应用于各种下游任务&#xff0c;包括…

VideoComposer: Compositional Video Synthesis with Motion Controllability

decompose videos into three distinct types of conditions: textual conditions, spatial conditions, temperal conditions 条件的内容&#xff1a; a. textual condition: coarse grained visual content and motions, 使用openclip vit-H/14的text encoder b. spatial co…

Splashtop 将在 NAB 展会上推出音视频剪辑增强功能

加利福尼亚州拉斯维加斯 Splashtop 在简化随处办公远程解决方案领域处于领先地位&#xff0c;在今年举行的 NAB 展会上将推出 Enterprise 解决方案的高级性能功能&#xff0c;均面向广播和媒体工作者而设计。 Splashtop Enterprise 经过优化&#xff0c;可为执行视频剪辑、唇…

Excel文件解析--超大Excel文件读写

使用POI写入 当我们想在Excel文件中写入100w条数据时&#xff0c;我们用普通的XSSFWorkbook对象写入时会发现&#xff0c;只有在将100w条数据全部加载入内存后才会用write()方法统一写入&#xff0c;这样效率很低&#xff0c;所以我们引入了SXSSFWorkbook进行超大Excel文件的读…

java开发之路——node.js安装

1. 安装node.js 最新Node.js安装详细教程及node.js配置 (1)默认的全局的安装路径和缓存路径 npm安装模块或库(可以统称为包)常用的两种命令形式&#xff1a; 本地安装(local)&#xff1a;npm install 名称全局安装(global)&#xff1a;npm install 名称 -g本地安装和全局安装…

【Leetcode】string类刷题

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;Leetcode刷题 目录 1.仅反转字母2.字符串中第一个唯一字符3.验证回文串4.字符串相加5.反转字符串I I6.反转字符串中的单词III7.字符串相乘8.把字符串转换为整数 1.仅反转字母 题目链接&#xff1a;…