代码随想录第43天|416. 分割等和子集,1049. 最后一块石头的重量 II, ​494.目标和,​ 474.一和零(一窍不通)

news2024/11/25 7:04:00

416. 分割等和子集

思路

本题是01背包的应用题

  • 背包的体积为sum / 2
  • 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  • 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。

动态五部曲:

 1.确定dp数组以及下标的含义

dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。

本题中物品重量是nums[i],物品价值也是nums[i]

那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了。

2.确定递推公式

dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]

3.dp数组如何初始化

本题初始化为0就可以了

4.确定遍历顺序

如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!

5.举例推导dp数组

dp[j]的数值一定是小于等于j的。

代码实现

class Solution {
    public boolean canPartition(int[] nums) {
        int n=nums.length;
        int sum=0;
        for(int num:nums){
            sum+=num;
        }
        if(sum%2!=0){return false;}
        int target=sum/2;
        int[] dp=new int[target+1];
        for(int i=0;i<n;i++){
            for(int j=target;j>=nums[i];j--){//从后往前依次填充dp
                //物品i的重量是nums[i],其价值也是nums[i]
                dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);
            }
            if(dp[target]==target){return true;}
        }
        return false;

    }
}

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

本题与416题相似,就是要把石头分成重量尽量相等的两堆,相撞后剩下的石头重量尽可能小

物品重量和物品价值都是stone[i]

1.确定下标和dp数组含义

dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]

2.确定递推公式

dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);

3.dp数组如何初始化

题目中给出1 <= stones.length <= 30,1 <= stones[i] <= 1000,所以最大重量就是30 * 1000 。

而我们要求的target其实只是最大重量的一半,所以dp数组开到15000大小就可以了。当然我们也可以把石头遍历一遍,计算出石头总重量 然后除2,得到dp数组的大小

如何初始化dp[j]呢,因为重量都不会是负数,所以dp[j]都初始化为0就可以了

4.确定遍历顺序

如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!

5.举例推导dp数组

代码实现

class Solution {
    public int lastStoneWeightII(int[] stones) {
        int sum=0;
        for(int i:stones){
            sum+=i;
        }
        int target=sum>>>1;
        //初始化dp,容量为j的背包,最多可以背最大重量为dp[j]
        int[] dp=new int[target+1];
        for(int i=0;i<stones.length;i++){
            //倒序
            for(int j=target;j>=stones[i];j--){
                dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }
        return sum-dp[target]-dp[target];//dp[target]是一堆石头,sum-dp[target]是另一堆石头,二者相减就是相撞后的最小可能重量

        //动态规划
        //dp含义
        //dp初始化
        //递推公式
        //模拟
       

    }
}

494.目标和

公式推导:

既然为target,那么就一定有 left组合 - right组合 = target。

left + right = sum,而sum是固定的。right = sum - left

公式来了, left - (sum - left) = target 推导出 left = (target + sum)/2 。

target是固定的,sum是固定的,left就可以求出来。

此时问题就是在集合nums中找出和为left的组合。

1.确定dp数组以及下标的含义

dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法

2.确定递推公式

递推公式不理解

dp[j] += dp[j - nums[i]]

本题还是有点难度,大家也可以记住,在求装满背包有几种方法的情况下,递推公式一般为:

dp[j] += dp[j - nums[i]];

后面我们在讲解完全背包的时候,还会用到这个递推公式

3.dp数组如何初始化

从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。所以我们应该初始化dp[0]=1

4.确定遍历顺序

nums放在外循环,target在内循环,且内循环倒序。

5.举例推导dp数组

输入:nums: [1, 1, 1, 1, 1], S: 3

bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4

代码实现

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum=0;
        for(int i=0;i<nums.length;i++){sum+=nums[i];}
        //如果target过大,、
        if(target<0&&sum<-target){return 0;}
        if((target+sum)%2!=0){return 0;}//
        int size=(target+sum)/2;
        if(size<0){size=-size;}
        int[] dp=new int[size+1];
        dp[0]=1;
        for(int i=0;i<nums.length;i++){
            for(int j=size;j>=nums[i];j--){
                dp[j]+=dp[j-nums[i]];
            }
        }
        return dp[size];

    }
}

 474.一和零(一窍不通)

本题中strs 数组里的元素就是物品,每个物品都是一个!

而m 和 n相当于是一个背包,两个维度的背包

理解成多重背包的同学主要是把m和n混淆为物品了,感觉这是不同数量的物品,所以以为是多重背包。

但本题其实是01背包问题!

开始动规五部曲:

1.确定dp数组(dp table)以及下标的含义

dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]

2.确定递推公式

dp[i][j]=Math.max(dp[i][j],dp[i-zeroNum][j-oneNum]+1)

此时大家可以回想一下01背包的递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

对比一下就会发现,字符串的zeroNum和oneNum相当于物品的重量(weight[i]),字符串本身的个数相当于物品的价值(value[i])。

3.dp数组如何初始化

因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖。

4.确定遍历顺序

倒序遍历

本题物品就是strs里的字符串,背包容量就是题目描述中的m和n。

5.举例推导dp数组

以输入:["10","0001","111001","1","0"],m = 3,n = 3为例

最后dp数组的状态如下所示:

代码实现

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        //找出并返回 strs 的最大子集的长度,找出的该子集中最多有m个0和n个1.
        //dp[i][j]表示i个0和j个1时的最大子集大小
        int[][] dp=new int[m+1][n+1];
        int oneNum,zeroNum;
        for(String str:strs){
            oneNum=0;//记录每个str的0 的个数
            zeroNum=0;
            for(char ch:str.toCharArray()){
                if(ch=='0'){
                    zeroNum++;
                }
                else{oneNum++;}
            }
            for(int i=m;i>=zeroNum;i--){
                for(int j=n;j>=oneNum;j--){
                    dp[i][j]=Math.max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);//+1是累计数量加1
                }
            }        
        }
        return dp[m][n];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】

❓ 剑指 Offer 67. 把字符串转换成整数 难度&#xff1a;中等 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为…

C++学习笔记(堆栈、指针、命名空间、编译步骤)

C 1、堆和栈2、指针2.1、指针的本质2.2、指针的意义2.3、清空指针2.4、C类中的this 3、malloc and new4、命名空间4.1、创建命名空间4.2、使用命名空间 5、编译程序的四个步骤5.1、预处理5.2、编译5.3、汇编5.4、链接 1、堆和栈 堆&#xff08;heap&#xff09;和栈&#xff0…

领域驱动设计:DDD与微服务的关系

文章目录 基础概念软件架构模式的演进微服务设计和拆分的困境为什么 DDD 适合微服务&#xff1f;DDD 与微服务的关系 基础概念 DDD 虽然历史很久了&#xff0c;但它与微服务和中台设计的结合&#xff0c;却是一片很新的领域。早在 2003 年就诞生的 DDD&#xff0c;怎么来指导“…

基于spring boot+ vue开发的位置数据展现和分析平台源码 UWB源码

spring boot vue位置数据展现和分析平台源码 UWB室内外高精度定位系统源码 智慧工厂是现代工厂信息化发展的新阶段&#xff0c;基于UWB定位技术&#xff0c;融合位置物联网、GIS可视化等技术&#xff0c;实现对人员、物资精确管理。在重点区域设置电子围栏&#xff0c;无权限…

【Mysql】数据库第一讲(服务器数据库的安装和基础操作介绍)

数据库基础 &#x1f361;1.CentOs服务器数据库的安装&#x1f367;2.基础使用&#x1f368; 2.1 服务器&#xff0c;数据库&#xff0c;表关系&#x1f366;2.2使用案例&#xff1a; &#x1f967;3.数据库分类&#x1f9c1;4.存储引擎&#x1f370;4.Mysql库的操作&#x1f3…

YOLO目标检测——密集人群人头数据集+已标注yolo格式标签下载分享

实际项目应用&#xff1a;城市安防、交通管理、社会研究、商业应用、等多个领域数据集说明&#xff1a;YOLO密集人群人头目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;共4300张图片。标注说明&#xff1a…

【web开发】6、Django(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Django是什么&#xff1f;二、使用步骤1.安装Django2.创建项目3.创建app4.快速上手 数据库操作1.安装第三方模块2.自己创建数据库3.DJango链接数据库4.DJango操…

ubuntu下查看文件(夹)大小的命令

记录下自己常用的查看文件夹和文件大小的命令。 1、查看当前所处的文件夹的整个大小&#xff08;只看当前文件夹大小&#xff09; du -sh2、查看当前文件夹中各个文件的大小 用-l或者-lh都行&#xff0c;加个h会增加可读性&#xff0c;如果想看具体某个文件&#xff0c;在后…

wires hark抓包内容解析

1.Frame 22001&#xff1a;这是该数据包的序号&#xff0c;表示wires hark已经捕获并显示了22001个数据包&#xff1b; 2.225 bytes on wire (1800 bits)&#xff1a;该数据的原始大小、以字节和比特显示&#xff1b; 3.225 bytes captured (1800 bits)&#xff1a;wires har…

元宇宙Web3.0科普---MoneyKing链游平台新格局介绍

众所周知&#xff0c;当前元宇宙“行业化”概念爆发后&#xff0c;当前社会甚至全世界再次步入一个全新的世界格局分水岭&#xff1b;随之而来的&#xff0c;包括了元宇宙具像化落地的Web3.0概念。 如果有人不懂什么是元宇宙&#xff0c;不懂什么是Web3.0&#xff0c;小编用最…

多线程与高并发——并发编程(5)

文章目录 五、线程池1 什么是线程池2 JDK自带的构建线程池的方式2.1 FixedThreadPool2.2 SingleThreadExecutor2.3 CachedThreaPool2.4 ScheduleThreadPool2.5 WorkStealingPool3 ThreadPoolExecutor应用&源码剖析3.1 为什么要自定义线程池3.2 ThreadPoolExecutor应用3.3 T…

数据透视表如何让多个行标签并列显示?

数据透视表如何让多个行标签并列显示&#xff1f; “数据透视表工具 - 报表布局" 这里有三种格式&#xff1a;&#xff08;1&#xff09;以压缩形式显示&#xff1b;&#xff08;2&#xff09;以大纲&#xff1b;&#xff08;3&#xff09;以表格形式。 选择“以表格显…

轻量容器引擎Docker基础使用

轻量容器引擎Docker Docker是什么 Docker 是一个开源项目&#xff0c;诞生于 2013 年初&#xff0c;最初是 dotCloud 公司内部的一个业余项目。 它基于 Google 公司推出的 Go 语言实现&#xff0c;项目后来加入了 Linux 基金会&#xff0c;遵从了 Apache 2.0 协议&#xff0c;…

MySQL-DDL语句

MySQL-DDL语句 数据库操作语句增删数据库查看数据库列表创建数据库进入&#xff08;使用&#xff09;数据库/查看当前所在的数据库查看数据库的建库语句查看数据库的编码集和校验集删除数据库修改数据库的编码集查看数据库支持的编码集和校验集 数据库备份备份单个数据库恢复数…

基于spring boot+ vue+ mysql开发的UWB室内外定位系统源码

现代制造业厂区面积大、人员数量多、物资设备不断增加&#xff0c;随着工业信息化技术的发展&#xff0c;大型制造企业中对人员、车辆、物资的管理要求越来越细致。 高精度定位管理系统使用UWB室内定位技术&#xff0c;通过在厂区安装定位基站&#xff0c;为人员或设备佩戴定位…

djanjo安装-各版本对应表

djanjo安装-各版本对应表 1 各版本对应表 django详细版本与python版本对照表&#xff0c;尽量按照表中的版本对应安装 2 djanjo安装 pip install django2.2.* // 默认会安装:Django2.2的最新版本2.2.28和对应的sqlparse-0.4.4、pytz等包python -m django --version // 检测…

抖店的产品是怎么卖出去的?带你了解抖店的核心玩法,不需要直播

我是王路飞。 你认为抖店就是在抖音开直播&#xff0c;然后把产品吆喝着卖出去吗&#xff1f; 如果你是这样看待抖店的话&#xff0c;那只能说明你根本不了解抖音小店&#xff0c;也不了解抖音的带货模式。 今天就给你们讲一下抖店的产品都是怎么卖出去的。 带你了解抖店的…

【Terraform】Terraform自动创建云服务器脚本

Terraform 是由 HashiCorp 创建的开源“基础架构即代码”工具 &#xff08;IaC&#xff09; 使用HCL&#xff08;配置语言&#xff09;描述云平台基础设施&#xff08;这里教你使用低级基础设施&#xff1a;交换机、云服务器、VPC、带宽&#xff09; Terraform提供者&#xf…

SpringBoot原理-自动配置-方案

自动配置原理 在运行SpringBoot项目启动类&#xff08;SpringBootApplication标注启动类&#xff09;启动SpringBoot项目时&#xff0c;SpringBootApplication是一个混合注解&#xff0c;包括 SpringBootConfiguration&#xff08;&#xff09;标识该类是一个配置类&#xff0…

SpringMVC:从入门到精通,7篇系列篇带你全面掌握--四.5分钟搞定文件上传与下载

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 需要添加的依赖 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</a…