【代码随想录day 35】 力扣 1049. 最后一块石头的重量 II

视频讲解:https://www.bilibili.com/video/BV14M411C7oV/?vd_source=a935eaede74a204ec74fd041b917810c

文档讲解:https://programmercarl.com/1049.最后一块石头的重量II.html#思路

力扣题目:https://leetcode.cn/problems/last-stone-weight-ii/

这道题本质上还是个01背包问题,本质上可以计算背包容量为sum / 2 的背包最大能装多少价值的东西,sum - dp[j]即为另一半的价值,再减去dp[j]即为两边的差

  1. dp含义:dp[j]表示容量为j的背包能装0-i的物品的最大价值
  2. 递推公式:在一维数组的基础上进行更新dp[j] = max(dp[j], dp[j- stones[i]] + stones[i]);
  3. 初始化,可以同遍历一起,初始化为0
  4. 遍历。二维表中最上一行往最下一行遍历
  5. 打印数组
    一维写法:
cpp 复制代码
class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum = 0;
        for(int i : stones)
        {
            sum += i;
        }
        int target = sum / 2;
        //本质上是一个看是否能装满sum/2的题,
        //1. dp[j]含义:在容量为j的背包里stone[i]能装的最多的价值
        vector<int> dp(target + 1, 0);
        //2. 递推公式:dp[j] = max(dp[j], dp[j- stones[i]] + stones[i]);
        //3.初始化:初始化二维数组的最上一行和最左一列
        //4.遍历方式:从后往前
        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 - 2 * dp[target]);
    }
};

二维写法:

cpp 复制代码
int lastStoneWeightII(vector<int>& stones) {
        int sum = 0;
        for(int i : stones)
        {
            sum += i;
        }
        int target = sum / 2;
        //本质上是一个看是否能装满sum/2的题,
        //1. dp[i][j]含义:在容量为j的背包里stone能装的最多的价值
        vector<vector<int>> dp(stones.size(), vector<int>(target + 1, 0));
        //2. 递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j- stones[i]] + stones[i]);
        //3.初始化:初始化二维数组的最上一行和最左一列
        for(int i = 0; i < stones.size(); ++i)
        {
            dp[i][0] = 0;
        }
        for(int j = 0; j <= target; ++j)
        {
            if(j >= stones[0])
            {
                dp[0][j] = stones[0];
            }
        }
        //遍历从上往下从左往右
        for(int i = 1; i < stones.size(); ++i)
        {
            for(int j = 1; j <= target; ++j)
            {
                if(j < stones[i])
                {
                    dp[i][j] = dp[i - 1][j];
                }
                else
                {
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j- stones[i]] + stones[i]);
                }
                //cout << "i,j:" << dp[i][j] << endl;
            }
        }
        return (abs(sum - 2 * dp[stones.size() - 1][target]));

    }
};
相关推荐
三毛的二哥6 小时前
BEV:典型BEV算法总结
人工智能·算法·计算机视觉·3d
南宫萧幕7 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
故事和你918 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
我叫黑大帅8 小时前
为什么map查找时间复杂度是O(1)?
后端·算法·面试
炽烈小老头9 小时前
【每天学习一点算法 2026/04/20】除自身以外数组的乘积
学习·算法
skilllite作者9 小时前
AI agent 的 Assistant Auto LLM Routing 规划的思考
网络·人工智能·算法·rust·openclaw·agentskills
py有趣11 小时前
力扣热门100题之不同路径
算法·leetcode
_日拱一卒11 小时前
LeetCode:25K个一组翻转链表
算法·leetcode·链表
啊哦呃咦唔鱼11 小时前
LeetCodehot100-394 字符串解码
算法
小欣加油11 小时前
leetcode2078 两栋颜色不同且距离最远的房子
数据结构·c++·算法·leetcode·职场和发展