class Solution {
public int lastStoneWeightII(int[] stones) {
// 类似于题416,此题也等价与这样的场景,将这些石块尽可能的分成两份大小极其接近的石堆,将两份同时去除量小的那份的数量,剩余的那些就是最小可能的重量
int sum = 0;
for(int i=0; i<stones.length; i++){
sum += stones[i];
}
// n表示石块的数量
int n = stones.length;
// 1.确定dp数组,dp[j] 表示容量为j的背包最多能放石块的重量
int bagSize = sum / 2;
int[] dp = new int[bagSize+1];
// 2.确定递推关系 dp[j] = Math.max(dp[j],stones[i] + dp[j-stones[i]]);
// 3.进行初始化
dp[0] = 0;
for(int i=0; i<stones.length; i++){
for(int j=bagSize; j>=stones[i]; j--){
dp[j] = Math.max(dp[j],stones[i] + dp[j-stones[i]]);
}
}
return sum - dp[bagSize] * 2;
}
}
运行结果: