【动态规划专栏】背包问题:1049. 最后一块石头的重量 II

简介: 【动态规划专栏】背包问题:1049. 最后一块石头的重量 II


题目来源

本题来源为:

Leetcode1049. 最后一块石头的重量 II

题目描述

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

如果 x == y,那么两块石头都会被完全粉碎;

如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。

最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。

算法原理

本题的难点还是在于转化,将问题转化成目标和问题

1.状态表示

经验+题目要求

对于本题而言就是:

dp[i][j]表示:从前i个数中选,总和不超过j,此时的最大和

2.状态转移方程

问题已经转化成了01背包问题,分析跟01背包问题一样

因此状态方程为:

dp[i][j]=dp[i-1][j];
 if(j>=stones[i-1])
dp[i][j]=max(dp[i][j],dp[i-1][j-
stones[i1]]+stones[i-1]);

3.初始化

4.填表顺序

从上往下填买没一行

5.返回值

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:
    int lastStoneWeightII(vector<int>& stones) 
    {
        int sum=0;
        for(auto x:stones)
        sum+=x;
        int n=stones.size();
        int m=sum/2;
        //创建dp表
        vector<vector<int>> dp(n+1,vector<int>(m+1));
        //填表
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;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]);
            }
        }
        //返回值
        return sum-2*dp[n][m];
    }
};

空间优化

代码实现:

class Solution 
{
public:
    int lastStoneWeightII(vector<int>& stones) 
    {
        int sum=0;
        for(auto x:stones)
        sum+=x;
        int n=stones.size();
        int m=sum/2;
        //创建dp表
        vector<int> dp(m+1);
        //填表
        for(int i=1;i<=n;i++)
        {
            for(int j=m;j>=stones[i-1];j--)
            {
                dp[j]=max(dp[j],dp[j-stones[i-1]]+stones[i-1]);
            }
        }
        //返回值
        return sum-2*dp[m];
    }
};
相关文章
|
网络协议 网络架构
数据从发出到接收的细节介绍{封装与解封装}
本文将介绍了详细的封装在每一层的具体的操作,可以让大家学习到数据从发出到收到的具体过程。
|
7月前
|
人工智能 程序员 测试技术
通义灵码与魔搭 Notebook 深度集成:在线编码开箱即用,开发效率倍增
通义灵码 2.0 AI 程序员 2025 年 1 月正式上线,目前已经服务百万开发者,成为国内开发者最受欢迎的智能编码助手。
|
11月前
|
人工智能 IDE 程序员
GitHub Copilot 免费了!程序员们的福音来了!
《GitHub Copilot 免费了!程序员们的福音来了!》 近日,GitHub 宣布其 AI 编程助手 GitHub Copilot 现在可以免费使用。曾经每月需支付 10 美元订阅费的 Copilot,现在向所有人开放免费版本,这对个人开发者、初学者和小型团队来说是个大好消息。免费版支持 GPT 和 Claude 模型,并提供每月 2000 次代码补全和 50 条聊天消息等核心功能。用户只需注册或登录 GitHub 账户,在 VS Code 中安装扩展并激活免费版即可使用。此外,Visual Studio Code 也完全免费,进一步降低了开发门槛。 除了
11992 7
GitHub Copilot 免费了!程序员们的福音来了!
|
消息中间件 数据采集 关系型数据库
离线数仓(三)【业务日志采集平台搭建】(2)
离线数仓(三)【业务日志采集平台搭建】
|
存储 人工智能 算法
AI与大数据的结合:案例分析与技术探讨
【8月更文挑战第22天】AI与大数据的结合为各行各业带来了前所未有的机遇和挑战。通过具体案例分析可以看出,AI与大数据在电商、智能驾驶、医疗等领域的应用已经取得了显著成效。未来,随着技术的不断进步和应用场景的不断拓展,AI与大数据的结合将继续推动各行业的创新与变革。
1014 1
|
Linux C语言 Python
win10安装 配置 pypy3 以及 pypy3-pip
win10安装 配置 pypy3 以及 pypy3-pip
414 1
|
C语言
C语言for循环必备练习题
C语言for循环必备练习题
625 0
C语言for循环必备练习题
|
前端开发 数据可视化 容器
前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)
本文介绍了前端开发中块级格式化上下文(BFC)的概念和作用,以及如何创建BFC。同时,文章还讲解了`box-shadow`和`text-shadow`属性的用法,包括如何为元素添加阴影效果,并通过示例代码展示了这些属性的具体应用。
231 0
前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)
|
安全 机器人 测试技术
宇树Unitree Z1机械臂使用教程
本文是宇树Unitree Z1机械臂的使用教程,包括建立机械臂通信、基本运行demo、ROS Gazebo仿真demo、键盘控制demo、手柄控制demo、moveit真实机械臂demo以及其他高级控制demo的详细步骤和注意事项。教程涵盖了软件安装、环境配置、代码下载、编译运行等内容,并提供了机械臂操作的实用技巧。
1712 1
简易投影仪的制作(上)
简易投影仪的制作(上)
293 0