【打卡第241道】【动态规划DP01背包】【leetCode高频】:1049. 最后一块石头的重量 II
1、题目描述
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。
2、算法分析
尽量使石头分成重量相同的两堆,相互碰撞之后的剩下的石头最小。而且本题符合01背包,每一块石头只能只用一次。
本题物品的重量为store[i],物品的价值也为store[i]。
对应着01背包里的物品重量weight[i]和 物品价值value[i]。
1、定义数组dp
dp[j]是容量为j的背包,最多可以背dp[j]这么重的石头。
2、确定递推公式
01背包:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);其实重量和价值就是石头的重量
本题则是:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
3、dp数组初始化
重量不是负数,所以,初始化为0。因为我们定义的是整型的数组,所以默认元素为0。
4、确定遍历顺序
先遍历物品,再遍历背包
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]);} }
两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。
在计算target的时候,target = sum / 2 因为是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的。
那么相撞之后剩下的最小石头重量就是 (sum - dp[target]) - dp[target]。
3、代码实现
class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for(int s : stones){sum += s;}// 因为尽可能的分为和相等的两份。进行碰撞int target = sum / 2;// dp[j]:容量为j的背包,最多可以被dp[j]这么重的石头int[] dp = new int[target + 1];for(int i = 0;i < stones.length;i++){// 遍历重量for(int j = target;j >=stones[i];j--){dp[j] = Math.max(dp[j],dp[j - stones[i]] + stones[i]);}}// 两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。最后剩下的是sum - 2*dp[target]return sum - dp[target] - dp[target];}
}
【打卡第241道】【动态规划DP01背包】【leetCode高频】:1049. 最后一块石头的重量 II相关推荐
- LeetCode-动态规划背包题-1049. 最后一块石头的重量 II
描述 1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石 ...
- 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)
题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类 ...
- 代码随想录算法训练营day42 |动态规划之背包问题 11.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和
day42 11.分割等和子集 1.dp数组的含义 2.确定递推公式 3.dp数组初始化 4.确定遍历顺序 5.打印dp数组 1049. 最后一块石头的重量 II 1.确定dp数组以及下标的含义 2. ...
- 95. Leetcode 1049. 最后一块石头的重量 II (动态规划-背包问题)
步骤一.确定状态: 确定dp数组及含义 dp[i]表示的是: 背包的容量为i的情况下,所能得到物品的最大值 这里的物品容量和物品价值都是石头的重量 步骤二.推断状态方程: dp[j] = max(dp ...
- 动态规划——01背包
动态规划--01背包 1. 经典"01背包" 2. "01背包"方法归纳 3. 实战 3.1 分割等和子集 3.2 最后一块石头的重量 II 3.3 目标和 3 ...
- 数据结构与算法学习⑥(动态规划 题解 背包和打家劫舍问题)
数据结构与算法学习⑥(动态规划 动态规划 1.初识动态规划 1.1.从贪心说起 1.1.1.贪心的特点 1.1.2.贪心的局限性 1.1.3.贪心失效后怎么办 1.1.4.从最优化问题到递归 1.2. ...
- 购物打折C语言程序设计,算法提高 促销购物(动态规划+完全背包)-----------------C语言——菜鸟级...
问题描述 张超来到了超市购物. 每个物品都有价格,正好赶上商店推出促销方案.就是把许多东西一起买更便宜(保证优惠方案一定比原价便宜).物品要买正好的个数,而且不能为了便宜而买不需要的物品. 张超拿到了 ...
- c++ 动态规划-01背包
动态规划 - 01背包问题 1.使用递归遍历(穷举)求解: 01背包问题:给定 n 种物品和一个重量(容量)(限定条件)为 w 的背包,物品 i 的重量是 wi,其价值为 vi.(每种物品只有一个)问 ...
- 动态规划 dp01 西瓜分堆问题 c代码
先看下题目: 已知14个西瓜 的重量,分别为: 23 21 12 19 18 25 20 22 16 19 12 15 17 14 请将这些瓜分成两堆,每堆的个数不限,使两堆西瓜重量之差最小. 我们知 ...
最新文章
- mongo在哪创建管理员_如何给mongodb管理员权限
- 新消费风口再“热闹”,红利依然握在伊利、康师傅们手里
- imdb数据集_朴素贝叶斯分类imdb(代码分享)
- 隐藏驱动模块(源码)
- 推荐系统--联邦学习下的矩阵分解(6)
- MogDB存储过程事务控制与异常块
- 环形博弈 HDU - 3951
- Apache IoTDB 物联网数据库引擎
- Vue2.0进阶组件篇2 解析饿了么(spinner组件)
- PDF阅读器阅读论文跳转到参考文献,如何返回
- 【关系抽取】深入浅出讲解实体关系抽取(介绍、常用算法)
- spring-cloud-oauth2
- K-th Closest Distance (主席树)
- 分享:如何在线将两个PDF合并成一个
- 标准符号代表的意思汇总
- 哪个心情不好来看看,老逗了
- 系统扫描修复cmd命令
- UserAgent和获取手机内安装的所有app列表
- Js微信公众号引JS-SDK调起微信支付
- mysql漏洞如何打补丁_“永恒之黑”针对win10和服务器漏洞分析
热门文章
- SVG(可缩放矢量图形)绘制工具Method Draw
- 15. Flash Xss进阶 [ExternalInterface.call第一个参数]
- 幼儿园故事导入语案例_重要电话幼儿园大班故事活动优秀教案(附故事)
- 大数据-消息队列:Pulsar
- 分布式数据仓库最佳实践 - 码字小能手招募
- 天纵竞赛系统助力江苏省“苏小登杯”不动产登记技能竞赛暨首届全国赛省级选拔赛
- 虚拟物品交易 一盘大生意
- Java LTS版本——Java 8新特性
- android网络音乐的搜索不到,Android手机搜索不到内存卡音乐的解决办法
- 程序员:1行代码修改开机密码、1张图片让电脑死机