0-1背包
class Solution {
public int lastStoneWeightII(int[] stones) {
// 1 <= stones.length <= 30; 1 <= stones[i] <= 1000
int[] dp = new int[15001];
int sum = 0;
for(int i = 0; i < stones.length; i++){
sum += stones[i];
}
// 在计算target时,向下取整,所以sum - dp[target]一定大于等于dp[target]
int target = sum / 2;
dp[0] = 0;
// 遍历物品
for(int i = 0; i < stones.length; i++){
// 遍历背包
for(int j = target; j >= stones[i]; j--){
dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
}
}
// 相撞后剩下的最小石头重量计算
return sum - dp[target] - dp[target];
}
}
本题思想:尽量让石头分成重量相同的两堆,相撞后剩下的石头最小,这样转化为0-1背包问题