1049. 最后一块石头的重量II
01背包
import java.util.Arrays;
class Solution {
public int lastStoneWeightII(int[] stones) {
/**
* 题意可以理解为,将石头尽可能分成相等的两份,最后差值就是最小剩余重量
* 剩下的部分和《416. 分割等和子集》一样
* dp[j]定义为总重量为j的背包中,能放入的最大石头重量,最大值为target
*/
int sum = Arrays.stream(stones).sum();
int target = sum / 2;
int[] dp = new int[target + 1];
for (int i = 1; i <= stones.length; i++) {
for (int j = target; j >= stones[i - 1]; j--) {
dp[j] = Math.max(dp[j], dp[j - stones[i - 1]] + stones[i - 1]);
}
}
return sum - 2 * dp[target];
}
}
/**
* 时间复杂度 O(n^2)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/last-stone-weight-ii/