1049. 最后一块石头的重量 II
题目链接:
有一堆石头,用整数数组 stones
表示。其中 stones[i]
表示第 i
块石头的重量。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x
和 y
,且 x <= y
。那么粉碎的可能结果如下:
-
如果
x == y
,那么两块石头都会被完全粉碎; -
如果
x != y
,那么重量为x
的石头将会完全粉碎,而重量为y
的石头新重量为y-x
。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0
。
输入:stones = [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],这就是最优值。
示例 2:
输入:stones = [31,26,33,21,40]
输出:5
示例 3:
输入:stones = [1,2]
输出:1
提示:
-
1 <= stones.length <= 30
-
1 <= stones[i] <= 100
解题思路
最值问题一般都用动态规划来解决。其实本题和
根据题意,本题其实就是把一堆石头分成两堆,求两堆石头重量差最小值。要想让两堆石头的差值尽可能小,则两堆石头的总重量应尽可能地接近于所有石头的总重量/2。
我们可以明确:物品就是石头,物品的重量和价值就是每一块石头的重量,背包的容量就是所有石头的总重量/2。
动态规划五部曲:
-
确定dp数组以及其下标的含义
dp[j]
表示为容量为j
的背包最多可以背的石头重量 -
确定递推公式
根据
-
dp数组的初始化
dp[j] = 0
-
确定遍历顺序
只能先遍历物品,再遍历背包。 注意这种方式背包的遍历顺序是不一样的,要从大往小遍历。
-
举例推导dp数组
以 stones = [2,4,1,1] 为例
C++
class Solution { public: int lastStoneWeightII(vector<int>& stones) { int sum = 0; for (int i = 0; i < stones.size(); i++) { sum += stones[i]; } int target = sum / 2; vector<int> dp(target + 1, 0); 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]); } } return ( sum - dp[target] ) - dp[target]; } };
JavaScript
/** * @param {number[]} stones * @return {number} */ var lastStoneWeightII = function(stones) { let sum = 0; for (let i = 0; i < stones.length; i++) { sum += stones[i]; } let target = Math.floor(sum / 2); const dp = new Array(target + 1).fill(0); for (let i = 0; i < stones.length; i++) { for (let j = target; j >= stones[i]; j--) { dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]); } } return sum - dp[target] - dp[target]; };
-
时间复杂度:O(N*M),其中N是stones数组的长度,M是target的大小。
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)