有一堆石头,每块石头的重量都是正整数。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 xy,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x

最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0

示例:

输入:[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],这就是最优值。

提示:

  1. 1 <= stones.length <= 30
  2. 1 <= stones[i] <= 1000

解题思路

首先分析什么时候出现最小重量?如果将数组拆分为两个子数组,那么这两个子数组的差应该就是最后的返回值。也就是我们要将数组拆分为两个子数组,并且两个子数组和的差应该最小。

实际上这是一个01背包问题。对于每个石头两种情况,选或者不选,而背包的容量就是所有石头重量 W a l l W_{all} Wall​的一半 W h a l f W_{half} Whalf​,通过计算得到的就是最接近装满背包的重量 W t W_{t} Wt​,最后的结果就是 W a l l − 2 ∗ W t W_{all}-2*W_t Wall​−2∗Wt​。

class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:all_sum = sum(stones)mem = [0]*(all_sum//2+1)mem[0] = 1for i in stones:for j in range(all_sum//2, i-1, -1):mem[j] |= mem[j - i]for i in range(all_sum//2, -1, -1):if mem[i]:return all_sum - 2*ireturn 0

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

Leetcode 1049:最后一块石头的重量 II(超详细的解法!!!)相关推荐

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

    1049. 最后一块石头的重量 II 无论按照何种顺序粉碎石头,最后一块石头的重量总是可以表示成 可以这样理解,将所有的石头分为两堆,ki=1的石头是一堆,ki=-1的石头是另一堆,我们的目标就是求上 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 如何在asp.net中动态生成验证码
  2. IPFS中国社区丨最简单全面介绍IPFS
  3. Mysql8.0 15安装后怎么打开_mysql-8.0.15-winx64 解压版安装 图文详解
  4. java中sql查找_Java 中如何使用 SQL 查询文本
  5. 太极图正确画法_什么是太极?其意义是什么?太极图是谁画的?
  6. Kubernetes 编排系统
  7. 3dmax报错信息大全,最全解决方案来了
  8. 2022年iOS面试题简答题
  9. 三门峡市新型智慧城市顶层设计方案通过专家评审
  10. 大数据平台及挖掘调研
  11. 【长难句分析精讲】状语从句
  12. 上亿会员 为b站会员购众筹项目打下消费基础
  13. 可靠传输的实现机制——回退N帧协议GBN(Go Back N)
  14. 你的新媒体写作工具横向测评,请查收!
  15. 基于VC++6.0开发俄罗斯方块(五)
  16. 8个 Chatbot 框架介绍
  17. 去哪儿2018春季校园招聘软件开发工程师笔试经验
  18. 开发自己的编程语言(五)—— CIL中间代码的生成
  19. Android项目实战——菜鸟商城
  20. Go 每日一库之 email

热门文章

  1. php学习第一天之HTML篇
  2. docker拉取mysql镜像太慢的问题
  3. Jenkins构建项目的时候出现构建不稳定异常UNSTABLE
  4. [图论]分层图最短路
  5. 北京无人驾驶_无需预约!在北京的朋友可以一键呼叫“无人驾驶”出租车了
  6. [oracle问题] 创建表时弹出ORA-00942错误
  7. ElasticSearch 6.x 学习笔记:20.搜索排序
  8. drawstring 文本居中,如何在Java中居中drawString?
  9. htaccess 域名 linux,教你使用.htaccess文件实现指定域名访问指定二级目录
  10. MFC EnterCriticalSection 卡死问题