class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum =0;
vector<int>dp(15001,0);//因为最大可装30000,让两石头相撞取一半,我是这么理解的
for(int i=0; i<stones.size(); i++){
sum+=stones[i];
}
int target=sum/2;
//01背包 dp[i]容量为i的背包,最多可背dp[i]重的石头
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]);
}
}
//因为target/2时向下取整的,所以用总和减去两次相撞后得到的值,就是剩余,这块指头最小的可能重量
return sum-dp[target]-dp[target];
}
};
leetcode 1049 最后一块石头的重量2
最新推荐文章于 2024-07-25 11:23:22 发布