当前位置: 首页 > news >正文

二维背包问题(C++)

文章目录

  • 前言
  • 474. 一和零
    • 1.状态表示
    • 2.状态转移方程
    • 3.初始化
    • 4.填表顺序
    • 5.返回值是什么
    • 6.代码编写
    • 7.代码优化
  • 总结


前言

二维背包问题和基础背包问题的解题思路是一样的,唯一不同的就是二维背包是有两个限制条件,而一维背包只有一个限制条件。

474. 一和零

474. 一和零

1.状态表示

我们根据经验+题目要求,确定出状态标示:
dp[i][j][k]:从前i个字符串中挑选,字符0的个数恰好为j,字符1的个数恰好为k,此时的最多字符串个数。

2.状态转移方程

根据最后一个位置的情况划分问题
🌟如果i位置没有选,此时dp[i][j][k]=dp[i-1][j][k];
🌟如果i位置选择了,我们要保证字符0和1出现的次数必须等于j和k。
假设i位置字符串中字符0的个数为a,字符1的个数为b,我们必须满足
j-a>=0&&k-b>=0;
此时dp[i][j][k]=dp[i-1][j-a][k-b]+1;
🌟我们最终的dp[i][j][k]就是上面两种的最大值

3.初始化

我们要多开一行,一列以及一高。
🌟全部初始化为0
🌟注意下标的映射

4.填表顺序

我们只需要保证i从小值填到大只就可以

5.返回值是什么

返回dp[len][m][n]的值即可

6.代码编写

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {int len=strs.size();//建表+初始化vector<vector<vector<int>>>dp(len+1,vector<vector<int>>(m+1,vector<int>(n+1,0)));//填表+下标映射for(int i=1;i<=len;i++){//统计个数int a=0;int b=0;for(auto&e:strs[i-1]){if(e=='0') a++;else b++;}for(int j=0;j<=m;j++){for(int k=0;k<=n;k++){dp[i][j][k]=dp[i-1][j][k];if(j>=a&&k>=b) dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-a][k-b]+1);}}}//返回值return dp[len][m][n];}
};

7.代码优化

代码优化与一维01背包是相同的,利用滚动数组
填表顺序要保证从右往左

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {int len=strs.size();//建表+初始化vector<vector<int>>dp(m+1,vector<int>(n+1,0));//填表+下标映射for(int i=1;i<=len;i++){//统计个数int a=0;int b=0;for(auto&e:strs[i-1]){if(e=='0') a++;else b++;}//01背包,注意填表顺序从右往左for(int j=m;j>=a;j--){for(int k=n;k>=b;k--){dp[j][k]=max(dp[j][k],dp[j-a][k-b]+1);}}}//返回值return dp[m][n];}
};

总结

以上就是今天要讲的内容,本文仅仅详细介绍了 。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++入门9——list的使用
  • vue增加长时间无操作退出登录功能
  • C# 数组定义和常用方法
  • AI 浪潮中的一体化数据库|外滩大会之OceanBase实录
  • P1308 [NOIP2011 普及组] 统计单词数
  • aliyun图片存储OSS工具类
  • Cesium 问题:视角漫游时添加的无人机模型飞行时有抖动
  • 【软考】设计模式之责任链模式
  • Tube Qualify三维弯管测量系统用于弯管机修正弯管回弹参数
  • 一维数组的概念和应用
  • Excel单元格操作:读写单元格数据、格式设置与条件格式详解
  • 1.C_数据结构_基本知识
  • 第4章-03-用WebDriver获取页面Cookie
  • HarmonyOS开发5.0【rcp网络请求】
  • 【Android笔记】Android Studio打包 提示Invalid keystore format
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Kibana配置logstash,报表一体化
  • Python 基础起步 (十) 什么叫函数?
  • Spring声明式事务管理之一:五大属性分析
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 给第三方使用接口的 URL 签名实现
  • ------- 计算机网络基础
  • 力扣(LeetCode)56
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Mac 上flink的安装与启动
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • #1015 : KMP算法
  • #pragma data_seg 共享数据区(转)
  • #QT 笔记一
  • (1)svelte 教程:hello world
  • (C语言)fread与fwrite详解
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (转)德国人的记事本
  • (转)原始图像数据和PDF中的图像数据
  • .cfg\.dat\.mak(持续补充)
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .Net中wcf服务生成及调用
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • ?
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [2]十道算法题【Java实现】
  • [20150707]外部表与rowid.txt
  • [2016.7.Test1] T1 三进制异或
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [BUG] Authentication Error