最后一块石头的重量 II
1049. 最后一块石头的重量 II - 力扣(LeetCode)
也是三刷,能无阻力做出来,但是发现做的效果没有之前好了,可以学学之前做的时候是如何优化的。
AC:
int lastStoneWeightII(vector<int>& stones)
{//也是分为两组,要让这两组的差值最小即可//看做是背包,均分数值,即最大容量是 sum/2,然后选取来装,让其尽可能装满,最后用总量来减就是另一个背包的重量,将两者相减就是答案int sum=0;for(int i=0;i<stones.size();i++) sum+=stones[i];int total=sum/2;vector<int>dp(total+1,0);for(int i=0;i<stones.size();i++)for(int j=total;j>=stones[i];j--)dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);return abs((sum-dp[total])-dp[total]);
}
Faster:
优化方法是,多加了一个判断,如果恰好已经是一半了,那就直接返回就好,不需要再算剩下的了,因为此时已经是最好的安排了。
int lastStoneWeightII(vector<int>& stones)
{int dp[3002] = { 0 };int sum = 0;for (int s : stones) sum += s;int maxsize = sum / 2;dp[0] = 0;for(int i=0;i<stones.size();i++)for (int j = maxsize; j >= stones[i]; j--){if (dp[j] < maxsize)dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);else if (2*dp[j] == sum) return 0;//如果大于,那就顺延,不变}return sum - 2 * dp[maxsize];
}