题目:
代码(首刷看解析 2024年2月23日):
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
vector<int> dp(1501, 0);
int sum = accumulate(stones.begin(), stones.end(), 0);
int target = sum / 2;
for (int i = 0; i < stones.size(); ++i) {
for (int j = target; j >= stones[i]; --j) {
dp[j] = max(dp[j],dp[j - stones[i]] + stones[i]);
//cout<<"dp["<<j<<"]:"<<dp[j]<<" ";
}
//cout<<endl;
}
int res = (sum - dp[target]) - dp[target];
return res;
}
};
代码(二刷看解析 2024年7月4日 go)
func lastStoneWeightII(stones []int) int {
// 01背包问题:背包容量:sum / 2 物品数量 len(stones) 物品重量 stones[i] 物品价值 stones[i]
sum := 0
for i := 0; i < len(stones); i++ {
sum += stones[i]
}
target := sum / 2
var dp []int
// 初始化dp数组,dp[j]代表容量为j的背包最大容纳的物品重量
dp = make([]int, target + 1)
// 先遍历物品,在反向遍历容量
for i := 0; i < len(stones); i++ {
for j := target; j >= stones[i]; j-- {
if j - stones[i] >= 0 {
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i])
}
}
}
// 剩余的重量为(sum - dp[target]) - dp[target], 即较大的一堆石头 - 较小的一堆石头
return (sum - dp[target]) - dp[target]
}
func max(a,b int) int {
if a > b {
return a
}
return b
}