让石头分成重量相同的两堆(尽可能相同),相撞之后剩下的石头就是最小的。进一步转化成容量为重量总喝一半的背包最多可以装多少质量的石头。这样就转化成了背包问题。
最后求结果时,我们所最多能装的时dp[target],那另一半石头就是sum-dp[target],我们所求的就是(sum-dp[target])-dp[target],也就是sum-dp[target] * 2。
class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for(int num:stones) sum += num;int target = sum/2;int[] dp = new int[target + 1];for(int i=0;i<dp.length;i++){dp[i] = 0;}for(int i=0;i<stones.length;i++){for(int j=target;j>=stones[i];j--){dp[j] = Math.max(stones[i]+dp[j-stones[i]],dp[j]);}}return sum-dp[target] * 2;}
}
题目链接