LeetCode 1049 - 最后一块石头的最小可能重量(Last Stone Weight II)
题目描述
给定一堆石头,每块石头有一个整数重量,用数组 stones
表示。其中 stones[i]
是第 i 坊石头的重量。
每一回合,从中选出任意两块石头,将它们一起粉碎。假设这两块石头的重量分别为 x 和 y,且 x <= y,那么粉碎的规则如下:
- 如果 x == y,两块石头都会被完全粉碎,消失;
- 如果 x != y,重量为 x 的石头会被完全粉碎,而重量为 y 的石头的新重量为 y - x。
反复进行此过程,最多只会剩下一块石头。请返回这块石头的最小可能重量。如果所有石头都被粉碎了,返回 0。
题目分析
这道题看似复杂,实则是一道典型的 “划分两堆使得两堆重量差最小” 的变种问题。
关键观察
- 每次选择两块石头粉碎的操作,等价于用两块石头的重量差替代这两块石头。
- 最终剩下的石头重量,即两堆石头的重量差。
换句话说,这个问题转化为如何将 stones
分成两个子集,使得两个子集的重量差最小。
解题思路
我们用动态规划模拟「01背包」问题,目标是找到一个子集,使该子集重量和尽可能接近总重量的一半。