二维费用背包问题

1. 一和零

474. 一和零

题目中是在一个字符串数组中找出一个最大子集,满足 0 和 1 的个数不超过给定的值,这和之前的背包问题不一样的是,这里有两个限制条件,也就是二维费用背包问题,同时,这道题也是一道 01 背包的模型

状态表示:

dp[i][j][k] 表示,在前 i 个物品中挑选,字符 0 的个数不超过 j ,字符 1 的个数不超过 k ,所有选法中最大的子集长度

状态转移方程:

还是可以分为选和不选第 i 个元素,如果不选的话,那么 dp[i][j][k] 的状态就还是上一个状态,也就是 dp[i - 1][j][k] ,如果选的话,是需要保证 j >= a 并且 k >= b,然后才能更新为 dp[i - 1][j - a][k - b] + 1,由于题目中是求最大的子集,所以这两种情况还需要求出最大值(第二种情况存在时)

初始化:使用 j 和 k 时,是需要判断的,所以这两列就不用初始化了,当 i = 0 时,也就是字符串数组为空,找出子集,所以 i = 0 时,这一面就都是0 了

填表顺序:由于需要用到 i - 1 的状态,所以需要保证 i 从小到大遍历,然后再从小到大遍历 j 和 k

返回值:dp[len][m][n]

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        int len = strs.length;
        int[][][] dp = new int[len + 1][m + 1][n + 1];
        for (int i = 1; i <= len; i++) {
            int a = 0, b = 0;
            for (int x = 0; x < strs[i - 1].length(); x++) {
                if (strs[i - 1].charAt(x) == '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] = Math.max(dp[i][j][k], dp[i - 1][j - a][k - b] + 1);
                    }
                }
            }
        }
        return dp[len][m][n];
    }
}

空间优化:

二维费用的背包问题的优化和一维的是一个道理,把第一列的删掉就可以了

2. 盈利计划

879. 盈利计划

状态表示:

还是参考二维费用背包问题的状态表示方法

dp[i][j][k] 表示从前 i 个计划中选,总人数不超过 j ,总利润至少为 k ,有多少种选法

状态转移方程:

还是分为选和不选第 i 个元素,如果不选就是继承上一个状态 dp[i - 1][j][k],如果选,由于总人数不能超过 j ,是需要 j >= g[i] 的,也就是 j - g[i] 不能小于 0,而总利润至少为 k ,所以 k - p[i] 是可以小于 0 的,但是数组的下标也不能是负的,所以可以把总利润至少为(之前的负数)改为总利润至少为 0,题中求的是总的方案数,所以最终结果是这两种情况的和

初始化:由于填表是从下标为 1 开始的,所以把下标为 0 初始化一下即可,当 i = 0 时,也就是没有任务,此时的利润也是 0 ,所以不管用多少人数限制是多少,总利润都是 0,需要初始化的也就是人数 j 这一列,方案数都是 1(什么都不选),dp[0][j][0] 都是 1

填表顺序:和上一题一样,只需要保证 i 是从小到大即可

class Solution {
    public int profitableSchemes(int n, int m, int[] g, int[] p) {
        int len = g.length;
        int[][][] dp = new int[len + 1][n + 1][m + 1];
        //初始化
        for (int j = 0; j <= n; j++)
            dp[0][j][0] = 1;
        for (int i = 1; i <= len; i++) {
            for (int j = 0; j <= n; j++) {
                for (int k = 0; k <= m; k++) {
                    dp[i][j][k] = dp[i - 1][j][k];
                    if (j >= g[i - 1]) {
                        dp[i][j][k] += dp[i - 1][j - g[i - 1]][Math.max(0, k - p[i - 1])];
                    }
                    dp[i][j][k] %= (int) (1e9 + 7);
                }
            }
        }
        return dp[len][n][m];
    }
}

空间优化:

空间优化还是去掉第一列,由于是 01 背包模型,所以之后的循环都是降序

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

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

相关文章

React Query在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Query在现代前端开发中的应用 React Query在现代前端开发中的应用 React Query在现代前端开发中的应用 引言 React Query …

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下&#xff0c;当屏幕内容绘制完毕后&#xff0c;实际应用通常需要更新屏幕中的一部分内容&#xff0c;而不是单纯显示一个静态图片在那。 如下图所示&#xff0c;屏幕中有一个图片控件&#xff08;Img2&#xff09;和一个文本控件&#xf…

【stable diffusion模型】Stability AI出官方教程了,带你轻松玩转Stable Diffusion 3.5

前言 提示&#xff08;prompt&#xff09;是有效使用生成式 AI 图像模型的关键技巧。提示的结构直接影响生成的图像的质量、创造力和准确性。 今日凌晨&#xff0c;Stability AI 发布了 Stable Diffusion 3.5 的提示指南。该指南提供了 Stable Diffusion 3.5 的实用提示技巧&a…

docker安装到D盘

双击安装docker默认是安装在c盘&#xff0c;并且安装时我们没法选择位置&#xff0c;如果我们要安装在其他盘可以通过命令行安装 1、下载docker https://docs.docker.com/desktop/setup/install/windows-install/ Docker Desktop 可以使用 WSL 和 Hyper-V任意一种架构&#xf…

11.11机器学习_介绍和定义

一、 机器学习介绍与定义 1. 机器学习定义 机器学习&#xff08;Machine Learning&#xff09;本质上就是让计算机自己在数据中学习规律&#xff0c;并根据所得到的规律对未来数据进行预测。 机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习&#xff08;Deep…

ssm111基于MVC的舞蹈网站的设计与实现+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;舞蹈网站当然也不能排除在外。舞蹈网站是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采用Java技…

蓝桥杯c++算法学习【2】之搜索与查找(九宫格、穿越雷区、迷宫与陷阱、扫地机器人:::非常典型的必刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 搜索与查找 一、九宫格 【问题描述】 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三 …

【Windows 常用工具系列 20 -- MobaXterm 登录 WSL】

文章目录 MobaXterm 登录 WSL MobaXterm 登录 WSL 在 WSL 启动之后&#xff0c;打开 MobaXterm&#xff1a; 在 Distribution 中选择自己本地安装的 ubuntu 版本&#xff0c;我这里使用的是ubuntu-20.4&#xff0c;然后在 runmethod 中选择 Localhost connection. 连接成功之…

ReactPress 安装指南:从 MySQL 安装到项目启动

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是一个基于 React 的开源发布平台&#xff0c;适用于搭建博客、网站或内容管理系统&#xff08;CMS&#xff09;。本文将详细介绍如何安装 ReactPress&#xff0c;包括…

STM32 使用 STM32CubeMX HAL库实现低功耗模式

STM32 使用 HAL 库的低功耗模式测试使用 ...... 矜辰所致前言 上次画了一个 STM32L010F4 最小系统的板子&#xff0c;也做了一些基本测试&#xff0c;但是最重要的低功耗一直拖到现在&#xff0c;以前在使用 STM32L151 的时候用标准库做过低功耗的项目&#xff0c;现在都使…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理设备接入:海康NVR 3.0提示不在线如何处理?

在视频监控领域&#xff0c;设备的兼容性和互操作性一直是用户关注的重点。海康NVR管理平台EasyNVR作为一款轻量级的视频监控平台&#xff0c;凭借其强大的兼容性、可扩展性和丰富的功能&#xff0c;成为了公共安全领域“云平台”解决方案的杰出代表。然而&#xff0c;在实际应…

【C语言】Union

一.Union的用法 1.什么是Union? union 共用体名{ 成员列表 }; union&#xff0c;“联合体、共用体”&#xff0c;在某种程度上类似结构体struct的一种数据结构&#xff0c;共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。 2.为什么使用union&#xff1…

2023_Spark_实验十五:SparkSQL进阶操作

实验目标 通过实践掌握Spark SQL中复杂查询&#xff08;包括子查询、窗口函数、联接等&#xff09;的实现方式。了解如何通过合理的数据分区和缓存策略进行性能优化。实现一个基于Spark SQL的ETL数据处理流程&#xff0c;应用相关优化技巧。 实验背景 在本实验中&#xff0c…

PaoluGPT——窥视未知

上一题已经得到一个flag&#xff0c;还有一个flag 根据题目信息&#xff0c;说明还有一些聊天记录是没有公开的&#xff0c;另一个flag就在这些未公开的聊天记录中 下载题目附件看看&#xff0c;发现里面有个main.py&#xff1a; 可以看到有两条SQL查询语句&#xff0c;猜测应该…

初识C++ (三)

如果很迷茫的话&#xff0c;就学习吧 引用 一. 引用的概念 “引用(Reference)是 C 相对于C语言的又一个扩充。引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。 具体是什么意思呢&#xff1f; 我们这里来举个例子 比如&#xff1a;李逵&#xff0…

南京观海微电子----驱动电路中误导通及应对方法

驱动电路中的误导通 功率器件如 MOSFET、IGBT 可以看作是一个受门极电压控制的开关。当门极电压大于开通阈值时&#xff0c;功率器件就会 被开通&#xff0c;而当门极电压低于开通阈值时就会被关断。但是在实际的应用中&#xff0c;由于器件及外围线路寄生参数的影响&#xff0…

C++ —— 哈希详解 - 开散列与闭散列

目录 1. 哈希的概念 1.1 直接定址法 1.2 哈希冲突 1.3 负载因子 1.4 哈希函数 1.4.1 除法散列法/除留余数法 1.4.2 乘法散列法 1.4.3 全域散列法 1.5 处理哈希冲突 1.5.1 开放定址法&#xff08;闭散列&#xff09; 1. 线性探测&#xff08;挨着查找&#xff09; 2.…

NVR批量管理软件EasyNVR大华NVR管理平台如何在Linux环境下部署?

随着视频监控技术的不断进步&#xff0c;NVR&#xff08;网络视频录像机&#xff09;批量管理软件在维护公共安全、提升管理效能方面发挥着越来越重要的作用。EasyNVR作为一款功能强大的NVR批量管理软件&#xff0c;凭借其高效的视频处理能力、灵活的设备接入能力和智能分析功能…

js技能提升——手搓图片组展示——基础积累

// 图片组展示[{name:,src:}]showAltPics(picList[], index0) {if (picList.length 0) {layer.msg("图片路径不对&#xff0c;请重试&#xff01;", { time: 2000 });return false;}//解析展示let inPicListHtml ;let indexPic picList[index];for (let i 0; i &…

<项目代码>YOLOv8 番茄识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…