class Solution {
public int lastStoneWeightII(int[] stones) {
// totalWeight 用于保存所有石头的总重量
int totalWeight = 0;
for (int stone : stones) {
totalWeight += stone;
}
int n = stones.length;
// m 是 totalWeight 的一半。我们的目标是找到一个子集,它的和尽可能接近 m
int m = totalWeight / 2;
// dp[j] 表示是否可以从 stones 中选取一些石头,它们的重量之和等于 j
boolean[] dp = new boolean[m + 1];
dp[0] = true;
// 遍历 stones 中的每个石头,更新 dp
for (int stone : stones) {
for (int j = m; j >= stone; --j) {
// 如果 dp[j-stone] 是 true,那么加上当前的石头重量 stone,dp[j] 也应该是 true
dp[j] = dp[j] || dp[j - stone];
}
}
// 找到不超过 m 的最大的 j,使得 dp[j] 为 true
for (int j = m; ; --j) {
if (dp[j]) {
// 返回两个子集之间的差值
return totalWeight - 2 * j;
}
}
}
}
代码随想录算法训练营第43天● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
最新推荐文章于 2024-09-11 22:48:33 发布