[Algorithm][动态规划][二维费用的背包问题][一和零][盈利计划]详细讲解

本文主要是介绍[Algorithm][动态规划][二维费用的背包问题][一和零][盈利计划]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 0.原理讲解
  • 1.一和零
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.盈利计划
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


0.原理讲解

  • 本质仍然是背包问题,但是相较于普通的背包问题,只是限制条件多了一个而已

1.一和零

1.题目链接

  • 一和零

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • dp[i][j][k]:从前i个字符串中挑选,字符0的个数不超过j,字符1的个数不超过k,所有的选法中,最大的长度
    • 推导状态转移方程:根据最后一个位置的情况,分情况讨论
      请添加图片描述

    • 初始化:

      • 三个维度都多开一“行”虚拟结点
      • j, k这两个维度的初始化都可以交给DP阶段
    • 确定填表顺序:i从小到大

    • 确定返回值:dp[len][n][m]

  • 滚动数组优化空间
    • 大致思路与完全背包一致
    • 操作
      • 删除所有的i
      • 修改一下j, k的遍历顺序
    • 注意不要去强行解释优化后的妆台表示以及状态转移方程,费时费力还没啥意义

3.代码实现

// v1.0
int findMaxForm(vector<string>& strs, int n, int m) 
{int len = strs.size();vector<vector<vector<int>>> dp(len + 1, vector<vector<int>>(n + 1, vector<int>(m + 1)));for(int i = 1; i <= len; i++){// 先统计字符串中0 1的个数int a = 0, b = 0;for(auto& ch : strs[i - 1]){ch == '0' ? a++ : b++;}// DPfor(int j = 0; j <= n; j++){for(int k = 0; k <= m; 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][n][m];
}
---------------------------------------------------------------------------------
// v2.0 滚动数组优化
int findMaxForm(vector<string>& strs, int n, int m) 
{int len = strs.size();vector<vector<int>> dp(n + 1, vector<int>(m + 1));for(int i = 1; i <= len; i++){// 先统计字符串中0 1的个数int a = 0, b = 0;for(auto& ch : strs[i - 1]){ch == '0' ? a++ : b++;}// DPfor(int j = n; j >= a; j--){for(int k = m; k >= b; k--){dp[j][k] = max(dp[j][k], dp[j - a][k - b] + 1);}}}return dp[n][m];
}

2.盈利计划

1.题目链接

  • 盈利计划

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • dp[i][j][k]:从前i个计划中挑选,总人数不超过j,总利润至少为k,一共有多少种选法
    • 推导状态转移方程:根据最后一个位置的情况,分情况讨论
      请添加图片描述

    • 初始化:

      • 三个维度都多开一“行”虚拟结点
      • dp[0][j][0] = 1
      • k这个维度的初始化可以交给DP阶段
    • 确定填表顺序:i从小到大

    • 确定返回值:dp[len][n][m]

  • 滚动数组优化空间
    • 大致思路与完全背包一致
    • 操作
      • 删除所有的i
      • 修改一下j, k的遍历顺序
    • 注意不要去强行解释优化后的妆台表示以及状态转移方程,费时费力还没啥意义

3.代码实现

// v1.0
int profitableSchemes(int n, int m, vector<int>& g, vector<int>& p) 
{const int MOD = 1e9 + 7;int len = g.size();// Initvector<vector<vector<int>>> dp(len + 1, vector<vector<int>>(n + 1, vector<int>(m + 1)));for(int j = 0; j <= n; j++){dp[0][j][0] = 1;}// DPfor(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]][max(0, k - p[i - 1])];}dp[i][j][k] %= MOD;}}}return dp[len][n][m];
}
------------------------------------------------------------------------------
// v2.0 滚动数组优化
int profitableSchemes(int n, int m, vector<int>& g, vector<int>& p) 
{const int MOD = 1e9 + 7;int len = g.size();// Initvector<vector<int>> dp(n + 1, vector<int>(m + 1));for(int j = 0; j <= n; j++){dp[j][0] = 1;}// DPfor(int i = 1; i <= len; i++){for(int j = n; j >= g[i - 1]; j--){for(int k = m; k >= 0; k--){dp[j][k] += dp[j - g[i - 1]][max(0, k - p[i - 1])];dp[j][k] %= MOD;}}}return dp[n][m];
}

这篇关于[Algorithm][动态规划][二维费用的背包问题][一和零][盈利计划]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053927

相关文章

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo