1049. 最后一块石头的重量 II 题目链接
解题方法
1.dp数组及下标的含义:
dp[j]:背包容量为j,最大重量为dp[j]
2.递推公式:
dp[j]=max(dp[j],dp[j-weight[i]]+weight[i])
3.初始化:
dp[j]=0,避免把石头重量的最大值覆盖
4.确定遍历顺序:
先遍历物品,再遍历背包,且内层for循环倒序遍历
5.距离推导dp数组
Code
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
vector<int>dp(1501,0);
int sum=0;
int target=0;
for(int i=0;i<stones.size();i++)
{
sum+=stones[i];
}
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]);
}
}
return sum-dp[target]-dp[target];
}
};
复杂度
时间复杂度
O(n*m),m为石头重量的一半,n为石头块数
空间复杂度
O(m)