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相关推荐

  1. LeetCode-动态规划背包题-1049. 最后一块石头的重量 II

    描述 1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石 ...

  2. 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)

    题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类 ...

  3. 代码随想录算法训练营day42 |动态规划之背包问题 11.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和

    day42 11.分割等和子集 1.dp数组的含义 2.确定递推公式 3.dp数组初始化 4.确定遍历顺序 5.打印dp数组 1049. 最后一块石头的重量 II 1.确定dp数组以及下标的含义 2. ...

  4. 95. Leetcode 1049. 最后一块石头的重量 II (动态规划-背包问题)

    步骤一.确定状态: 确定dp数组及含义 dp[i]表示的是: 背包的容量为i的情况下,所能得到物品的最大值 这里的物品容量和物品价值都是石头的重量 步骤二.推断状态方程: dp[j] = max(dp ...

  5. 动态规划——01背包

    动态规划--01背包 1. 经典"01背包" 2. "01背包"方法归纳 3. 实战 3.1 分割等和子集 3.2 最后一块石头的重量 II 3.3 目标和 3 ...

  6. 数据结构与算法学习⑥(动态规划 题解 背包和打家劫舍问题)

    数据结构与算法学习⑥(动态规划 动态规划 1.初识动态规划 1.1.从贪心说起 1.1.1.贪心的特点 1.1.2.贪心的局限性 1.1.3.贪心失效后怎么办 1.1.4.从最优化问题到递归 1.2. ...

  7. 购物打折C语言程序设计,算法提高 促销购物(动态规划+完全背包)-----------------C语言——菜鸟级...

    问题描述 张超来到了超市购物. 每个物品都有价格,正好赶上商店推出促销方案.就是把许多东西一起买更便宜(保证优惠方案一定比原价便宜).物品要买正好的个数,而且不能为了便宜而买不需要的物品. 张超拿到了 ...

  8. c++ 动态规划-01背包

    动态规划 - 01背包问题 1.使用递归遍历(穷举)求解: 01背包问题:给定 n 种物品和一个重量(容量)(限定条件)为 w 的背包,物品 i 的重量是 wi,其价值为 vi.(每种物品只有一个)问 ...

  9. 动态规划 dp01 西瓜分堆问题 c代码

    先看下题目: 已知14个西瓜 的重量,分别为: 23 21 12 19 18 25 20 22 16 19 12 15 17 14 请将这些瓜分成两堆,每堆的个数不限,使两堆西瓜重量之差最小. 我们知 ...

最新文章

  1. mongo在哪创建管理员_如何给mongodb管理员权限
  2. 新消费风口再“热闹”,红利依然握在伊利、康师傅们手里
  3. imdb数据集_朴素贝叶斯分类imdb(代码分享)
  4. 隐藏驱动模块(源码)
  5. 推荐系统--联邦学习下的矩阵分解(6)
  6. MogDB存储过程事务控制与异常块
  7. 环形博弈 HDU - 3951
  8. Apache IoTDB 物联网数据库引擎
  9. Vue2.0进阶组件篇2 解析饿了么(spinner组件)
  10. PDF阅读器阅读论文跳转到参考文献,如何返回
  11. 【关系抽取】深入浅出讲解实体关系抽取(介绍、常用算法)
  12. spring-cloud-oauth2
  13. K-th Closest Distance (主席树)
  14. 分享:如何在线将两个PDF合并成一个
  15. 标准符号代表的意思汇总
  16. 哪个心情不好来看看,老逗了
  17. 系统扫描修复cmd命令
  18. UserAgent和获取手机内安装的所有app列表
  19. Js微信公众号引JS-SDK调起微信支付
  20. mysql漏洞如何打补丁_“永恒之黑”针对win10和服务器漏洞分析

热门文章

  1. SVG(可缩放矢量图形)绘制工具Method Draw
  2. 15. Flash Xss进阶 [ExternalInterface.call第一个参数]
  3. 幼儿园故事导入语案例_重要电话幼儿园大班故事活动优秀教案(附故事)
  4. 大数据-消息队列:Pulsar
  5. 分布式数据仓库最佳实践 - 码字小能手招募
  6. 天纵竞赛系统助力江苏省“苏小登杯”不动产登记技能竞赛暨首届全国赛省级选拔赛
  7. 虚拟物品交易 一盘大生意
  8. Java LTS版本——Java 8新特性
  9. android网络音乐的搜索不到,Android手机搜索不到内存卡音乐的解决办法
  10. 程序员:1行代码修改开机密码、1张图片让电脑死机