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

无论按照何种顺序粉碎石头,最后一块石头的重量总是可以表示成

可以这样理解,将所有的石头分为两堆,ki=1的石头是一堆,ki=-1的石头是另一堆,我们的目标就是求上述和式的最小非负值,即这两堆石头重量之差的绝对值diff也是所有划分当中最小的。

记所有石头的总重量为sum,ki=-1的石头重量之和是neg,则ki=1的石头的重量之和为sum-neg。

则有:

要使最后一块石头的重量尽可能地小,neg需要在不超过sum/2的前提下尽可能地大。

因此本问题可以看作是背包容量为sum/2,物品重量和价值均为stonesi的 0-1 背包问题。

定义二维布尔数组dp,dp[i+1][j]表示前 i 个石头能否凑出重量 j。

dp[0][] 为不选任何石头的状态,因此除了 dp[0][0] 为真,其余dp[0][j] 全为假。

对于第 i 个石头,考虑凑出重量 j:

  • 若 j<stones[i],则不能选第 i 个石头,此时有 dp[i+1][j]=dp[i][j];
  • 若 j≥stones[i],存在选或不选两种决策,不选时有dp[i+1][j]=dp[i][j],选时需要考虑能否凑出重量 j−stones[i],即 dp[i+1][j]=dp[i][j−stones[i]]。若二者均为假则 dp[i+1][j] 为假,否则dp[i+1][j] 为真。

因此状态转移方程如下:

求出dp[n][] 后,所有为真的 dp[n][j] 中,最大的 j 即为 neg 能取到的最大值。

代入 sum−2⋅neg 中即得到最后一块石头的最小重量。

由于 dp[i+1][] 的每个元素值的计算只和 dp[i][] 的元素值有关,因此可以使用滚动数组的方式,去掉 dp 的第一个维度。

Code

Python

class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:total = sum(stones)n, m = len(stones), total // 2dp = [False] * (m + 1)dp[0] = Truefor weight in stones:for j in range(m, weight - 1, -1):dp[j] |= dp[j - weight]ans = 0for j in range(m, -1, -1):if dp[j]:ans = total - 2 * jbreakreturn ans

LeetCode 1049. 最后一块石头的重量 II相关推荐

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

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

  2. 代码随想录刷题|LeetCode 1049. 最后一块石头的重量II 494. 目标和 474.一和零

    目录 1049. 最后一块石头的重量 II 思路 最后一块石头的重量|| 494. 目标和 思路 0.求什么 1.确定dp数组的含义 2.递推公式 3.初始化dp数组 4.遍历顺序 目标和 474.一 ...

  3. LeetCode 1049. 最后一块石头的重量 II(DP)

    1. 题目 有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出任意两块石头,然后将它们一起粉碎. 假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x ...

  4. 2022-2-19 Leetcode 1049.最后一块石头的重量II

    例二分析:26+21-40 = 7 33-31 = 2 7-2 = 5 相当于小块石头集合之后一起去砸大石头. 这道题和最后一块石头的重量I 有什么不同? 例子更复杂了.(虽然不知道复杂在哪里) 这道 ...

  5. LeetCode 1049. 最后一块石头的重量 II 做题小结

    题目 有一堆石头,每块石头的重量都是正整数.每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下:如果 x == y,那 ...

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

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

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

    这个问题可以转化为0-1背包问题,背包的大小为所有石头的重量之和的一半,意思就是找到要求的石头组合重量之和最接近所有石头重量的一半.具体的C++代码如下: class Solution { publi ...

  8. LeetCode:1049.最后一块石头的重量II 494.目标和 474.一和零

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

  9. LeetCode刷题day43|1049. 最后一块石头的重量 II、 494. 目标和、474.一和零

    文章目录 一.1049. 最后一块石头的重量 II 二.494. 目标和 三.474.一和零 一.1049. 最后一块石头的重量 II 这道题其实就与"分割子集"一样,就是先将总和 ...

最新文章

  1. [C#]网络编程系列专题二:HTTP协议详解
  2. 黑客组织利用El Machete窃取全球政府超过100G数据
  3. __init__在python中的用法知乎_python使用selenium爬虫知乎的方法示例
  4. linux文件给另一用户名和密码错误,linux重命名root后,使用su命令切换新用户时,提示密码错误...
  5. 合作模式歌利亚机器人_智能时代挑战下的机器人教育新方向!
  6. Kali 2020版 Linux操作系统解决系统语言问题(英文--中文)
  7. 华为云容器部署WordPress服务
  8. SQL那些事儿(四)--oracle创建表空间、用户创建
  9. android 初始化变量,变量初始化 - Android Studio
  10. 应用优化-HTTP缓存
  11. 拓端tecdat|Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
  12. ListView的item监听事件,并且把值传递给另一个activity
  13. 迅雷9下载down.php,迅雷9-文件下载工具-迅雷9下载 V9.1.49.1060测试版-完美下载
  14. 依然顺滑!Dragonwell 11如何改造全新垃圾回收器ZGC? | 龙蜥技术
  15. 利用threading多线程爬取王者荣耀的高清壁纸
  16. circos 可视化手册-histograms 篇
  17. android 图片跑马灯动画,【Android自定义View】- 文本跑马灯效果
  18. Unity零基础到入门 ☀️| 近万字教程 对 Unity 中的 动画系统基础 全面解析+实战演练,你确定要错过吗?
  19. 如何优雅地跟老板请假?
  20. 数据分析[1.2]--《深入浅出数据分析》1-分解数据

热门文章

  1. js 面向对象例子
  2. 总结一些java编程题的思路
  3. MySQL dump文件导入
  4. Linux中Cache内存占用过高解决办法
  5. python学习笔记(字典)
  6. Commons IO方便读写文件的工具类
  7. SEO优化工具之——Google Adwords 关键词工具
  8. C语言指令启动mcs51计时器是,嵌入式C语言程序设计:使用MCS-51
  9. 近似求PI(15 分)
  10. python源码编译 mingw_使用 MinGW 编译 C/C++ 写的 python 扩展