474. 一和零

news/2024/11/8 18:07:42/

目录

1、题目描述

2、思路:动态规划01背包

2.1、确定dp数组及下标含义

2.2、确定递归数组

2.3、初始化

2.4、确定遍历顺序


1、题目描述

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

示例 1:

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。
示例 2:

输入:strs = ["10", "0", "1"], m = 1, n = 1
输出:2
解释:最大的子集是 {"0", "1"} ,所以答案是 2 。
 

提示:

1 <= strs.length <= 600
1 <= strs[i].length <= 100
strs[i] 仅由 '0' 和 '1' 组成
1 <= m, n <= 100

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ones-and-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2、思路:动态规划01背包

根据题目描述可以知道,返回最大子集长度,子集中最多有m个0和n个1 。

其实可以理解为,每一个01字符串都代表了一个权重为j个0,k个1 的物体,而我们的背包大小也有两个权重,一个是m一个是n。那么问题就可以翻译为,一个权重为m|n的背包最多可以放几个物体,而且每个物体不可以重复拿取,这样问题便成为了01背包问题。

2.1、确定dp数组及下标含义

dp[j][k]表示了背包大小为i j时能容纳的最大子集长度。

2.2、确定递归数组

dp[j][k] = max(dp[j][k],dp[j-str[i][0]][k-str[i][1]]+1);

2.3、初始化

背包大小为0|0时,因为字符串最小长度为1,能放的字符串为0,故初始化为0,其余的dp数组根据其他的数组得来,初始化为最小非负数0 。

2.4、确定遍历顺序

最外层单层for循环从前往后遍历所有的物品(字符串),内层两个for循环从小到大遍历背包。

C++实现如下:

#include<iostream>
#include<vector>
using namespace std; 
class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {int length = strs.size();
//        int str[length][2];vector<vector<int> > str(length,vector<int>(2,0));for(int i = 0;i<length;++i){for(int j = 0;j<strs[i].size();++j){if(strs[i][j]=='0'){str[i][0]+=1;}}str[i][1] = strs[i].size() - str[i][0];}vector<vector<int> > dp(m+1,vector<int>(n+1,0));for(int i = 0;i<length;++i){for(int j = m;j>=str[i][0];--j){for(int k = n;k>=str[i][1];--k){dp[j][k] = max(dp[j][k],dp[j-str[i][0]][k-str[i][1]]+1);}}}return dp[m][n];}
};


http://www.ppmy.cn/news/64058.html

相关文章

精炼计算机网络——物理层(二)

文章目录 前言2.4信道复用技术2.4.1 频分复用、时分复用和统计时分复用2.4.2 波分复用2.4.3 码分复用 2.5 数字传输系统2.6 带宽接入技术2.6.1 ADSL技术2.6.2 光纤同轴混合网&#xff08;HFC网&#xff09;2.6.3 FTTx技术 总结 前言 上篇文章&#xff0c;我们初步了解了物理层…

Java设计模式-装饰模式

简介 装饰模式在Java领域是一种常见的设计模式&#xff0c;它能够在不改变对象原有结构的情况下&#xff0c;动态地为对象添加新的功能。它通过封装原有对象&#xff0c;在运行时动态地为对象添加新的行为或者修改原有行为&#xff0c;以扩展对象的功能。这种方式避免了继承的…

Python 操作 Excel,如何又快又好?

➤数据处理是 Python 的一大应用场景&#xff0c;而 Excel 则是最流行的数据处理软件。因此用 Python 进行数据相关的工作时&#xff0c;难免要和 Excel 打交道。Python处理Excel 常用的系列库有&#xff1a;xlrd、xlwt、xlutils、openpyxl ◈xlrd &#xff0d; 用于读取 Exce…

[Gitops--9]微服务项目sangomall代码配置修改及资源清单文件

微服务项目sangomall代码配置修改及资源清单文件 1. 中间件的地址 1.1 Nacos 集群外 nacos-server.intra.com 192.168.31.211集群内 nacos-server.sangomall.svc.cluster.local. nacos-server.sangomall.svc.cluster.local.:88481.2 Redis 集群内 redis.sangomall.svc.c…

基于matlab仿真混合波束成形在多用户MIMO-OFDM系统中的使用

一、前言 本 例 说明 了 如何 在 大规模 MIMO 通信 系统 的 发射 端 采用 混合 波束 成形&#xff0c; 同时 使用 多 用户 和 单 用户 系统 的 技术。该示例采用全通道探测来确定发射机的通道状态信息。它将所需的预编码划分为数字基带和模拟RF组件&#xff0c;对多用户和单用户…

整数和二进制相互转换,二进制相加计算

整数7怎么转成二进制 整数7转换成二进制的方法是&#xff1a;不断获取除以2后的商&#xff0c;直到商为0&#xff0c;把每一步得到的余数倒序排列得到的就是对应的二进制数。 7除以2的商为3余1&#xff0c; 3除以2的商为1余1&#xff0c; 1除以2的商为0余1。 将余数倒序排列得到…

【网络】Socket编程-UDP篇

文章目录 预备知识源IP地址和目的IP地址源MAC地址和目的MAC地址源端口号和目的端口号"端口号port" 和 "进程ID"认识TCP/UDP协议网络字节序 Socket编程sockaddr结构API接口 简单的UDP网络程序服务器server服务端创建套接字:socket函数**socket的底层原理** …

计算机视觉(5)—— 图像分类

目录 五、图像分类 5.1 AlexNet 5.2 VGG 5.3 GoogLeNet、Inception 5.3.1 Inception V1 5.3.2 Inception V2 5.3.3 Inception V3 5.3.4 Inception V4 5.4 ResNet 残差网络 5.4.1 ResNet 5.4.2 ResNeXt 5.5 CNN设计准则 五、图像分类 5.1 AlexNet 5.2 VGG 5.3 Go…