代码随想录算法训练营day43

题目:1049. 最后一块石头的重量 II 、494. 目标和、474.一和零

参考链接:代码随想录

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

思路:本题石头是相互粉碎,粉碎后剩下的重量就是两块石头之差,我们可以想到,把石头分成两堆总重量分别为A和B,则这两堆相互粉碎后,剩下的就是这两堆的重量之差,我们需要使得这个差尽可能小,即把石头尽可能分为两部分,使得他们重量差最小。然后和01背包问题对应起来,物品的重量就是石头的重量stones[i],物品的价值也是石头的重量stones[i],背包的容量最大为重量和除以2,因为这样使背包尽可能装满,二者的差就会最小。dp五部曲:dp数组,dp[j]表示容量为j的背包能装的最大重量;递推公式,和之前一样,当i能装进去的时候,dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);dp初始化,首先全部初始化为0,和上题一样;遍历顺序,对物品从0-i遍历,但对背包容量需要从大到小遍历;举例略。时间复杂度O(mn),m为总重量。

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum=accumulate(stones.begin(),stones.end(),0);
        int target=sum/2;
        vector<int> dp(target+1,0);//初始化dp数组
        for(int i=0;i<stones.size();i++){
            for(int j=target;j>=0;j--){
                if(stones[i]<=j){
                    dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);
                }
            }
        }
        return sum-dp[target]*2;
    }
};

关键在于如何把本题和01背包问题联系起来。

494. 目标和

思路:本题初看就是回溯法的组合总和,但是会超时。然后想想dp的方法,所有数前面只有+和-两种情况,我们设+的总和为x,则-的总和为sum-x,最后得到x-(sum-x)=2x-sum=target,故x=(sum+target)/2,我们把x当做背包容量,然后把x装满即可,需要求的是把容量为x的背包装满用的方法数量,其中weight和value都为nums。对x的计算,考虑取整问题,由于2x=sum+target,故sum和target必须奇偶性相同,如果不同则无解,直接排除,还有target的绝对值不可能大于sum,不然也无解,这两种情况都需要先排除。然后是方案的计算方法,本题也是一个元素只能放一次,故也是01背包问题,但是求解的东西不一样,01背包求的是最大价值,这里求的是方法数,故我们的dp数组需要有变化。五部曲:dp数组,dp[j]表示容量为j的背包装满的最大方法数;递推公式,还是和之前的方法思考,如果物品i不能最先放进去,那么就没有新的方法产生,方法数还是原来的dp[j],如果物品i可以先放进去,那么方法就需要在原有的基础上增加dp[j-nums[i]],故dp[j]+=dp[j-nums[i]];dp初始化,首先如果全部初始化为0,则递归后全部都是0,明显不符合,对于dp[0],不能初始化为0
只能初始化为1,即背包完全不放,也是一种方法,对其他dp[j],递推公式都是从dp[0]慢慢累加起来的,我们初始化为1;遍历顺序,和之前相同;举例,这种不好想的题目,还是得举例的,nums=[1,1,1,1,1],target=3,x=4,dp初始化为[1,0,0,0,0],当i=0时,dp由递推公式计算的[1,1,0,0,0],i=1时,[1,2,1,0,0],i=2时,[1,3,3,1,0],i=3时,[1,4,6,4,1],i=4时,[1,5,10,10,5],最终答案为5,符合。时间复杂度O(mn)。

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum=accumulate(nums.begin(),nums.end(),0);
        if((sum+target)%2==1||abs(target)>sum){
            return 0;
        }
        int x=(sum+target)/2;
        vector<int> dp(x+1,0);
        dp[0]=1;
        for(int i=0;i<nums.size();i++){
            for(int j=x;j>=0;j--){
                if(nums[i]<=j){
                    dp[j]+=dp[j-nums[i]];
                }
            }
        }
        return dp[x];
    }
};

本题的几个重点,首先是根据每个元素放一次想到01背包问题,然后是将正负分开计算得出背包容量,这里类似上题的一分为二,只考虑一部分就是背包容量,最后是dp数组的定义,需要根据题目所求灵活设置。
本题的递推公式dp[j]+=dp[j-nums[i]]常用于求背包中方法数。

474.一和零

思路:本题初看一点想法都没有,只想到纯暴力方法,把所有子集列出来,再计算0和1的个数。直接看解答,首先要弄明白几种背包问题的区别。
在这里插入图片描述
strs里数组的元素就是物品,每个物品只有一个,m和n相当于一个背包,只不过这个背包有两个维度,即两个维度都不能超过容量,物品的weight也有两个维度,分别是0和1的数量,value可以全部认为是1,因为要求集合元素数最大。这里如果按照最初始的01背包问题,需要三维数组,这里我们还是压缩一维,使用二维数组。五部曲:dp数组,dp[i][j]表示背包中最多物品的数量,其中0的个数不超过i,1的个数不超过j;递推公式,设物品k中0和1的数量分别为zeroNum和oneNum,则如果物品k能先放进去背包时,dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);初始化,对dp[0][0],物品数量为0,我们可以就全部初始化为0,这个和普通的01背包是一个意思;遍历顺序,从背包容量大到小遍历;举例略。时间复杂度O(kmn),k为strs长度。

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));//初始化全为0
        for(int k=0;k<strs.size();k++){
            int zeroNum=0,oneNum=0;
            for(char c:strs[k]){
                if(c=='0'){
                    zeroNum++;
                }
                if(c=='1'){
                    oneNum++;
                }
            }
            for(int i=m;i>=0;i--){
                for(int j=n;j>=0;j--){
                    if(zeroNum<=i&&oneNum<=j){
                        dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);
                    }
                }
            }
        }
        return dp[m][n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/687897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战四(引入Axios,并调用第一个接口)

RealWorld接口综述 本项目调用的是RealWorld项目的开放接口。 接口文档如下&#xff1a; https://main--realworld-docs.netlify.app/docs/specs/backend-specs/endpoints https://main--realworld-docs.netlify.app/docs/specs/frontend-specs/swagger RealWorld 是一个适…

Day45 代码随想录打卡|二叉树篇---路径总和

题目&#xff08;leecode T112&#xff09;&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;…

LeetCode刷题之HOT100之最小路径和

2024/6/7 今天天气转晴&#xff0c;将栀子花移动到二楼阳台&#xff0c;愿它好&#xff01;昨天准备做完这题再回去&#xff0c;太晚了感觉很疲惫&#xff0c;做不下去&#xff0c;今天早上来把它做了。 1、题目描述 2、逻辑分析 昨天上午做过一个跳格子的题目&#xff0c;也…

设计软件有哪些?效果工具篇(2),渲染100邀请码1a12

这次我们继续介绍一些渲染效果和后期处理的工具。 1、Krakatoa Krakatoa是由Thinkbox Software开发的强大的粒子渲染器&#xff0c;可用于Autodesk 3ds Max等软件。它专注于处理大规模粒子数据&#xff0c;提供了高效的渲染解决方案&#xff0c;适用于各种特效、粒子系统和模…

配音方面目前可以用AIGC替代吗?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

李飞飞解读创业方向:「空间智能」

在AI领域&#xff0c;李飞飞教授一直是一个举足轻重的存在。她的研究和见解不仅推动了计算机视觉的发展&#xff0c;更对人工智能的未来方向产生了深远的影响。在最近的一次演讲中&#xff0c;李飞飞详细解读了她对于「空间智能」的见解。本文将对她的演讲内容进行详细解读&…

第一周:计算机网络概述(上)

一、计算机网络基本概念 1、计算机网络通信技术计算机技术 计算机网络就是一种特殊的通信网络&#xff0c;其特殊之处就在于它的信源和信宿就是计算机。 2、什么是计算机网络 在计算机网络中&#xff0c;我们把这些计算机统称为“主机”&#xff08;上图中所有相连的电脑和服…

大学信息资源管理试题及答案,分享几个实用搜题和学习工具 #职场发展#微信

人工智能技术的发展正逐渐改变着我们的生活&#xff0c;学习如何运用这些技术将成为大学生的必备素养。 1.彩虹搜题 这是个微信公众号 算法持续优化&#xff0c;提升搜题效果。每一次搜索都更精准&#xff0c;答案更有价值。 下方附上一些测试的试题及答案 1、在SpringMVC配…

衰老过程中肠道菌群变化及其对老年抑郁和认知下降的影响

谷禾健康 编辑在老龄化过程中&#xff0c;生理功能逐渐衰退&#xff0c;伴随着多种疾病的发生&#xff0c;对老年人的身心健康构成重大威胁。 衰老是一个渐进、持续的过程&#xff0c;受到多种因素的影响&#xff0c;包括遗传、饮食、运动、生活方式等生理因素&#xff0c;也有…

【Linux】进程(8):Linux真正是如何调度的

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;8&#xff09;&#xff1a;Linux真正是如何调度的&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 之前我们讲过&#xff0c;在大…

IP地址相同,是否意味着身处同一地点?深入探究IP地址的奥秘

IP地址一样是不是证明在一个地方&#xff1f;在数字化时代的今天&#xff0c;网络已经深入到我们生活的每个角落。IP地址作为网络连接的标识符&#xff0c;其重要性不言而喻。然而&#xff0c;当我们遇到两个或多个设备拥有相同IP地址的情况时&#xff0c;很多人会自然地认为这…

智慧视觉怎么识别视频?智慧机器视觉是通过什么步骤识别视频的?

智慧视觉功能怎么识别视频&#xff1f;智慧视觉是搭载在智能设备比如手机、AI盒子、机器视觉系统上的一个应用程序或特性&#xff0c;采用计算机视觉和人工智能的技术来识别图像或视频中的内容。如果想了解视频识别&#xff0c;就要明白智慧视觉功能会涉及的以下几个关键步骤和…

Linux性能优化实战

Linux性能优化实战 33 | 关于 Linux 网络&#xff0c;你必须知道这些&#xff08;上&#xff09;如何提高系统并发&#xff1f;&#xff08;8条&#xff09;如何理解分布式&#xff1f;如何理解云计算&#xff1f;如何理解微服务&#xff1f;TCP/IP 网络栈如何分层&#xff1f;…

ctfshow-web入门-命令执行(web37-web40)

目录 1、web37 2、web38 3、web39 4、web40 命令执行&#xff0c;需要严格的过滤 1、web37 使用 php 伪协议&#xff1a; ?cphp://input post 写入我们希望执行的 php 代码&#xff1a; <?php system(tac f*);?> 拿到 flag&#xff1a;ctfshow{5c555d9a-6f55…

FactoryTalk View Site Edition的VBA基本应用

第一节 在VBA中标签的读取和写入 本例要达到的目标是通过FactoryTalk View Site Edition&#xff08;以下简称SE&#xff09;的VBA来访问PLC中的下位标签&#xff0c;并实现标签的读写。 1.准备工作 打开SE&#xff0c;选择应用程序类型&#xff08;本例是Site Edition Netwo…

NSSCTF-Web题目7

目录 [SWPUCTF 2022 新生赛]ez_rce 1、题目 2、知识点 3、思路 ​编辑 [MoeCTF 2022]baby_file 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]ez_rce 1、题目 2、知识点 ThinkPHP V5 框架漏洞的利用&#xff0c;命令执行 由于ThinkPHP5在处理控制器传参时&#xff…

SpringBoot项目启动后访问网页显示“Please sign in“

SpringBoot启动类代码如下 SpringBoot项目启动后访问网页显示"Please sign in"&#xff0c;如图 这是一个安全拦截页面&#xff0c;即SpringSecurity认证授权页面&#xff0c;因为SecurityAutoConfiguration是Spring Boot提供的安全自动配置类&#xff0c;也就是说它…

vue3+vite插件开发

插件开发目的:由于我司使用的前端技术栈为vue3tsvite2.Xaxios,在前端代码框架设计初期,做了把axios挂载到proxy对象上的操作,具体可见我的另一篇文章vue3TS自动化封装全局api_ts 封装腾讯位置api-CSDN博客 现在可以实现vue2的类似this.$api.xxx去调用接口,但是vue2源码使用的是…

Mac 使用Docker安装Elasticsearch、Kibana 、ik分词器、head

安装ElasticSearch 通过docker安装es docker pull elasticsearch:7.8.1 在本地创建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 编辑yml文件内容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…

DNF手游攻略:主C职业推荐,云手机强力辅助!

在《地下城与勇士》手游中&#xff0c;你是否厌倦了重复刷图和无休止的手动操作&#xff1f;利用VMOS云手机&#xff0c;你可以一键解决这些烦恼&#xff0c;实现自动打怪、一机多开&#xff0c;让游戏变得更加轻松愉快。下面我们将介绍如何使用VMOS云手机&#xff0c;以及推荐…