代码随想录第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.hqwc.cn/news/640105.html

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

相关文章

rCore-Turorial-Book第三课(计算机启动流程和程序内存布局与编译流程探索)

本节任务&#xff1a;梳理程序在操作系统中被编译运行的全流程&#xff0c;大体了解我们在没有操作系统的情况下&#xff0c;我们会面对那些困难 重点 1. 计算机组成基础 面对的困难&#xff1a;没有操作系统&#xff0c;我们必须直面硬件资源&#xff0c;管理起他们并为应用程…

PLSQL数据库

目录 什么是PLSQL数据库 PL数据库的实现方法 PL数据库的基本语法 1.作用 2.语法 3.赋值输出 4.引用 5.异常处理 6.if 判断 7.loop循环 8.while循环 9.for循环 10.游标 11.参数游标 12.索引 13.分区表 什么是PLSQL数据库 PL/SQL&#xff08;Procedure Language/…

mysql面试题八(SQL语句)

目录 1.SQL 基本组成部分 常用操作示例 创建表 插入数据 查询数据 更新数据 删除数据 创建索引 授予用户权限 2.常见的聚合查询 1. 计数&#xff08;COUNT&#xff09; 2. 求和&#xff08;SUM&#xff09; 3. 平均值&#xff08;AVG&#xff09; 4. 最大值&…

全新商业模式!链动3+1模式 无限链动收益!

链动31模式解析 的链动31模式&#xff0c;是一种精心设计的运营模式&#xff0c;它针对运营中的脱发问题提供了有效的解决方案。然而&#xff0c;这一模式并非完美无缺&#xff0c;它也有其固有的劣势。接下来&#xff0c;我们将通过详细的示例&#xff0c;对这一模式进行深入…

CVE-2024-3159:Out of bounds memory access in V8

前言 这个洞在今年的 Pwn2Own 上被利用&#xff0c;目前还没有公开报告。该漏洞可以说是 CVE-2023-4427 漏洞未正确修复&#xff0c;其原理和利用跟 CVE-2023-4427 没有本质区别&#xff0c;CVE-2023-4427 之前分析过&#xff0c;所以这里不作过多说明&#xff0c;仅仅做记录 …

SpringAOP从入门到源码分析大全(四)SpringAOP的源码分析

文章目录 系列文档索引六、EnableAspectJAutoProxy源码分析1、AnnotationAwareAspectJAutoProxyCreator源码&#xff08;1&#xff09;wrapIfNecessary方法&#xff08;2&#xff09;createProxy 2、getAdvicesAndAdvisorsForBean查找所有Advisor&#xff08;1&#xff09;find…

爬虫机试题-爬取新闻网站

之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求&#xff0c;感觉挺有意思就写了这篇文章&#xff0c;感兴趣的朋友可以看看。 拿到urllist 通过分析页面结构我们得以知道&#xff0c;这个页面本身没有新闻信息&#xff0c;是…

芒果超媒的“乘风破浪”,差了一点市场海浪的反馈

4月21日晚间&#xff0c;芒果超媒发布了2023年度&2024一季度报告。 芒果超媒2023年实现营业收入146.28亿元&#xff0c;同比增长4.66%&#xff1b;净利润35.56亿元&#xff0c;同比增长90.73%&#xff1b;基本每股收益1.90元。公司拟每10股派发现金红利1.8元。2024年第一季…

路由过滤,策略实验

1配置ip [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [r1-GigabitEthernet0/0/0]int l0 [r1-LoopBack0]ip add 192.168.0.1 32 [r1-LoopBack0]int l1 [r1-LoopBack1]ip add 192.168.1.1 32 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip add 100.1.1.2 24 [r…

【python】直接在python3下安装 jupyter notebook,以及处理安装报错,启动不了问题

目录 问题&#xff1a; 1 先做准备&#xff0c;查看环境 1.1 先看python3 和pip &#xff0c;以及查看是否有 juypter 1.2 开始安装 1.3 安装完成后得到警告和报错 2 处理安装的报错问题 2.1 网上有说是因为 pip 自身需要更新&#xff0c;更新之 2.1.1 更新pip 2.1.…

牛客NC238 加起来和为目标值的组合【中等 DFS C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/172e6420abf84c11840ed6b36a48f8cd 思路 本题是组合问题&#xff0c;相同元素不同排列仍然看作一个结果。 穷经所有的可能子集&#xff0c;若和等于target&#xff0c;加入最终结果集合。 给nums排序是为了方便…

基于SpringBoot的宠物领养网站管理系统

基于SpringBootVue的宠物领养网站管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宠物领养 宠物救助站 宠物论坛 登录界面 管理员界面 摘要 基于Spr…