首页 > 编程语言 >力扣474-一和零(Java详细题解)

力扣474-一和零(Java详细题解)

时间:2024-09-10 18:50:12浏览次数:14  
标签:背包 Java int 题解 力扣 01 物品 递推 dp

题目链接:474. 一和零 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。

如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。

如果大家感兴趣,我后期可以出一篇专门讲解01背包问题。

dp五部曲。

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

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

本题要求的是m个0n个1时子集中的最大长度。

其实这m个0n个1就是一种容器,我们要将该容器装满,求得子集的最大长度即可。

那么可以将这种容器抽象为背包,只不过这个背包是二维的,最大容量为m个0,n个1。

那么问题可以转化为将这个背包装满,求物品的数量。

接下来我们用动规五部曲来系统分析一下。

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

我们这个背包是二维的,所以我们的dp数组也得是二维的。

dp[i] [j]指有i个0m个1时最大能装的物品数量。

2.确定递推公式。

首先我们来看看纯01背包问题的递推公式。

dp[j] = Math.max(dp[j],dp[j - weight[i]] + value[i]);

那么本题的递推公式其实和01背包递推公式相似。

每个物品只有选和不选俩种状态。

不选的话就是dp[i] [j]因为没有选该物品,所以背包容量不变。

选的话就是dp[i - x] [j - y] + 1;其实x表示的是当前物品0的数量,y表示当前物品1的数量。

因为选的话,就得求出加入当前物品之前的背包容量能装入的最大物品数量,再加上该物品。也就是 + 1;

所以我们的递推公式就是 dp[i] [j] = Math.max(dp[i] [j],dp [i - x] [j - y] + 1);

3.dp初始化。

dp[0] [0]指的就是当背包中有0个0和0个1时能装入的物品数量,所以dp[0] [0] = 0;

其他的非0下标可以通过dp数组推出来,所以其他的我们就不初始化,没有意义。

4.确定dp的遍历顺序。

该题与01背包的遍历顺序相同,物品从前往后遍历,背包容量从后往前遍历上为了保证每个物品只放入了一次。

5.如果没有ac打印dp数组 利于debug。

如果没有出现差错,我们就可以不用打印,因为我是写题解,所以我就不添加核心代码以外的代码,不然代码显的有些冗余。

举个例子。

在这里插入图片描述

最终代码:

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        // 本题核心思路就是把这个背包装满,最多能装多少物品。
        //同时本题背包具有俩个维度。
        //递推公式 dp[i][j]是指在i个0j个1下能装满的物品数量。
        //那么每个物品也只有选和不选,该物品不选就是dp[i][j]
        //选的话就是dp[i - x][j - y] + 1,选择该物品的话要将装入前能装的最多物品加1,也就是加上这个物品
        //本题是把每个子集当做一个物品
        //确定dp数组
        int dp[][] = new int[m + 1][n + 1];
        //初始化dp数组
        dp[0][0] = 0;
        //遍历物品
        for (String s : strs) {
            int x = 0, y = 0;
            //统计每个物品的01数量
            for (int v = 0;v < s.length();v ++) {
                if (s.charAt(v) == '0') {
                    x++;
                } else {
                    y++;
                }
            }
            //遍历背包
            //由于背包是俩个维度所以俩个要从后往前遍历 确保物品只放入了一次
            for (int i = m; i >= x; i--) {
                for (int j = n; j >= y; j--) {
                    //递推公式
                    dp[i][j] = Math.max(dp[i][j], dp[i - x][j - y] + 1);
                }
            }
        }
        return dp[m][n];
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

标签:背包,Java,int,题解,力扣,01,物品,递推,dp
From: https://blog.csdn.net/2302_79761426/article/details/142093786

相关文章

  • 力扣热题100 - 二叉树:将有序数组转换为二叉搜索树
    题目描述:题号:108给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。解题思路:思路一:中序构建二叉树选择根节点:首先,选择数组的中间元素作为根节点。这样做可以确保生成的二叉搜索树尽可能平衡。递归构建子树:将数组分......
  • 06JAVA第一次考试选择
    判断正确1,不含公共类的JAVA源文件名称可以随便命名,不受任何限制。2,编译当前路径下的HelloWorld.java文件,使用的命令是:javacHelloWorld.java。3,JamesGosling是Java语言的创始人之一。4,Java语言的标识符区分大小写。5,java.lang包的Character类的isJavaIdentifierStart方......
  • Java中日期时间类的学习
    日期时间类目录日期时间类Date类(日期时间)SimpleDateFormat类(格式化)Calendar类(日历)Date类(日期时间)序号方法和描述1booleanafter(Datedate)若当调用此方法的Date对象在指定日期之后返回true,否则返回false。2booleanbefore(Datedate)若当调用此方法的Date......
  • 基于Java web社区公共安全管理系统(源码+lw+部署文档+讲解等)
    文章目录前言......
  • 基于Java技术的车辆故障管理软件的设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言......
  • JAVA并发编程AQS原理剖析
    很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》、《JUC包之CAS原理》、《volatile核心原理》、《synchronized全能王的原理》,希望可以帮到大家巩固相......
  • luogu2516题解
    随机说话第一次交的时候写的版本是这个。下面在sum的计算上少了个else,遂出错。以后写的时候还是尽量简单点,主要是调试的时候好调。题目分析题目里面的公共子序列就是可以不连续可以为空的在字符串里出现顺序相同的子串。对于一个公共子序列,在找到最后一个公共的字符的时......
  • JavaWeb开发01 - HTML+CSS
    浏览器内核对前端代码进行渲染解析,为确保解析效果一直制定web标准。Web标准也称为网页标准,由一系列的标准组成,大部分由W3C(WorldWideWebConsortium,万维网联盟)负责制定。由三个组成部分:HTML:负责网页的结构(页面元素和内容)。CSS:负责网页的表现(页面元素的外观、位置等页面样式......
  • Day06.Java流程控制2
    Java流程控制循环结构While循环while(布尔表达式){//循环内容}最基本的循环只要布尔表达式为true,循环就会一直执行下去我们大多数情况会让循环停止下来,我们需要一个让表达式失效的方式来结束循环少数情况需要循环一直执行,比如服务器的请求响应监听等循环条件一直......
  • Java并发编程 第六章 共享模型之无锁
    1.引子实现1packagecn.itcast.testcopy;importjava.util.ArrayList;importjava.util.List;publicclassTestAccount{publicstaticvoidmain(String[]args){Accountaccount=newUnsafeAccount(10000);Account.demo(account);}......