Leetcode 1049. 最后一块石头的重量 II 动态规划-01背包
原题链接:Leetcode 1049. 最后一块石头的重量 II
难的不是背包,是怎么把问题转换成背包。。。。
参考题解:一篇文章吃透背包问题!(细致引入+解题模板+例题分析+代码呈现)
class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum=0;for(auto x:stones) sum+=x;int target = sum/2;int n=stones.size();// 把题目转换为背包问题:// 原问题:从一堆石头中,每次拿两块重量分别为x,y的石头,计算他们的差值,大于0则将差值加入数组,重复计算,最后计算剩下石头的最小重量// 转换后:把这堆石头分为两堆石头,计算他们的差值,求这两堆石头的最小值// 分析:要让两堆石头的差值最小,每堆中石头的和最好相等,即等于sum/2,或者接近相等// 建模为背包问题:将一堆石头放进最大容量为sum/2的背包,求放进去的石头的最大重量MaxWeight(MaxWeight<=sum/2)// 最终答案:两堆石头的差值 sum-2*MaxWeight// 背包最大容量为sum/2,dp[i][j]表示考虑前i个石头,他们的和小于等于j的最大重量vector<vector<int>> dp(n+1,vector<int>(target+1,0));for(int i=1;i<=n;i++){for(int j=1;j<=target;j++){dp[i][j]=dp[i-1][j];if(j>=stones[i-1]){dp[i][j]=max(dp[i][j],dp[i-1][j-stones[i-1]]+stones[i-1]);}}}int maxweight = dp[n][target];return sum - 2*maxweight;}
};