1. 题目

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

每一回合,从中选出任意两块石头,然后将它们一起粉碎。
假设石头的重量分别为 x 和 y,且 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 <= stones.length <= 30
1 <= stones[i] <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/last-stone-weight-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:LeetCode 1046. 最后一块石头的重量(priority_queue 堆)

  • 题目说任意两块石头可以相撞,转化为把n个石头分为2堆,任意一堆越接近总重s的一半
  • 这两堆做差肯定就是最小的
  • 那么就变成 0-1 背包,每个石头取或不取,求不超过s/2 的最大的重量
class Solution { //C++
public:int lastStoneWeightII(vector<int>& stones) {int i, j, n = stones.size(), sum = accumulate(stones.begin(),stones.end(), 0);vector<vector<bool>> dp(n+1,vector<bool>(sum/2+1, false));dp[0][0] = true;//dp[i][w], 遍历完第i个石头,可以得到重量为w吗?for(i = 1; i <= n; i++)//样本维度{for(j = 0; j <= sum/2; ++j)//重量维度{if(dp[i-1][j]){dp[i][j] = dp[i-1][j];//不取if(j+stones[i-1] <= sum/2)//不超,取dp[i][j+stones[i-1]] = true;}}}j = sum/2;while(dp[n][j] != true)//最接近一半的重量是 j j--;return sum-2*j;//一半是sum-j,一半是 j,做差}
};
  • 状态只跟上一行有关,再用逆序滚动数组,节省存储空间
class Solution { //C++
public:int lastStoneWeightII(vector<int>& stones) {int i, j, n = stones.size(), sum = accumulate(stones.begin(),stones.end(), 0);vector<bool> dp(sum/2+1, false);dp[0] = true;//dp[w], 遍历完第i个石头,可以得到的重量为w吗?for(i = 1; i <= n; i++)//样本维度{for(j = sum/2; j >= 0; --j)//重量维度{if(dp[j] && j+stones[i-1] <= sum/2)dp[j+stones[i-1]] = true;}}j = sum/2;while(dp[j] != true)j--;return sum-2*j;}
};

8 ms 8.2 MB

python3 解答

class Solution:# py3def lastStoneWeightII(self, stones: List[int]) -> int:n = len(stones)s = sum(stones)dp = [False]*(s//2+1)dp[0] = Truefor i in range(1,n+1):for j in range(s//2,-1,-1):if dp[j] and j+stones[i-1] <= s//2:dp[j+stones[i-1]] = Truej = s//2while not dp[j]:j -= 1return s-2*j

52 ms 13.6 MB

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

  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. 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. 【43天|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零 】

    1049. 最后一块石头的重量 II dp[j] 表示j容量的背包可以背下石头的最大重量. class Solution {public:int lastStoneWeightII(vector< ...

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

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

最新文章

  1. Spring----学习参考博客书单链接
  2. 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk
  3. 如何配置webpack的loader
  4. Keyboard Control
  5. 使用oradebug来获取跟踪文件的位置
  6. 2022年下半年软考报名时间汇总,最新版!
  7. Linux之文件通配符
  8. IDEA Maven配置,Tomcat配置
  9. C#随机生成姓名、电话类
  10. 贵州安顺:红色基因激活初心密码 为民服务谱写秀丽篇章
  11. 藏在表分区统计信息背后的小秘密
  12. mysql 安顺寻_夏日静心旅游路线,到安顺寻味乡愁吧
  13. 计算机网络技术动态路由配置,计算机网络实验六动态路由的配置
  14. Android版计算器(java实现,包含小数、负数、括号)代码和讲解
  15. Matlab里怎么注释掉一段(多行)代码
  16. 2012年最值得学习的IT视频资料及技术资讯类网站列举
  17. 在python中 0oa1是合法_在Python中0oa1是合法的八进制数字表示形式。
  18. VUE项目--卖座app
  19. Hibernate高级映射技术(一)自定义数据类型StringList (转)
  20. 骑驴找马:职业发展路图

热门文章

  1. Django的核心思想ORM
  2. linux模拟网络延迟,使用Nistnet搭建网络延迟模拟设备 (network delay simulator)
  3. 挂载nfs文件系统_综合架构-day38-NFS服务补充
  4. python哪个版本支持xp_windows支持哪个版本的python
  5. VS2010问题汇总
  6. 应用层为何不能设置分辨率
  7. LeetCode43——Multiply Strings(两个字符串表示的整数相乘)???
  8. Java学习总结之第十一章 Java集合
  9. Spark Core
  10. 高版本号chrome安装flashplayer debuger后无法使用的问题