【动态规划算法练习】day17

news2024/12/27 13:34:46

文章目录

  • 一、474. 一和零
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 二、879. 盈利计划
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 三、377. 组合总和 Ⅳ
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 四、96. 不同的二叉搜索树
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 总结


二维费用的背包问题:

一、474. 一和零

1.题目简介

474. 一和零
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
在这里插入图片描述

2.解题思路

3.代码

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<int> v(m + 1, 0);//初始化
        vector<vector<int>> dp(n + 1, v);//dp[j][k]表示满足“最多”有j个1和k个0的strs的最大子集的长度(最多:说明并不一定要求放满,因此不用判断dp[j - v1[i]][k - v0[i]]是否存在)
        vector<int> v1(strs.size(), 0);//字符串中1的个数
        vector<int> v0(strs.size(), 0);//字符串中0的个数
        for(int i = 0;i < strs.size(); ++i)//将字符串中的1和0分别存放
        {
            for(int j = 0;j < strs[i].size(); ++j)
            {
                if(strs[i][j] == '1') v1[i]++;
                else v0[i]++;
            }
        }
        for(int i = 0;i < strs.size(); ++i)
        {
            //题意可知这些字符串每个都只能使用一次,属于01背包问题,因此背包的遍历顺序是从后往前
            for(int j = n;j >= v1[i]; --j)
            {
                for(int k = m;k >= v0[i]; --k)
                {
                    dp[j][k] = max(dp[j - v1[i]][k - v0[i]] + 1, dp[j][k]);//放这个字符串和不放
                }
            }
        }
        return dp[n][m];//如果凑不出满足需要的子集,则返回0
    }
};

4.运行结果

在这里插入图片描述

二、879. 盈利计划

1.题目简介

879. 盈利计划
集团里有 n 名员工,他们可以完成各种各样的工作创造利润。
第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与。如果成员参与了其中一项工作,就不能参与另一项工作。
工作的任何至少产生 minProfit 利润的子集称为 盈利计划 。并且工作的成员总数最多为 n 。
有多少种计划可以选择?因为答案很大,所以返回结果模 10^9 + 7 的值。
在这里插入图片描述

2.解题思路

3.代码

class Solution {
public:
    int profitableSchemes(int n, int minProfit, vector<int>& group, vector<int>& profit) {
        int mod = 1e9 + 7;
        //由题意可知,这是一个01背包问题中的二维费用背包问题(二维指的是人数和利润这两个维度)
        vector<int> v(minProfit + 1, 0);
        vector<vector<int>> dp(n + 1, v);//dp[j][k]表示至少产生k的利润,最多提供j个员工时的计划数
        //初始化利润为0时的dp表
        for(int j = 0;j <= n; ++j)//无论人数是多少,我们都可以找到一个空集的方案
        {
            dp[j][0] = 1;
        }
        for(int i = 0;i < group.size(); ++i)
        {
            for(int j = n;j >= group[i]; --j)//(人数绝对不能是小于0的,因此j要大于等于group[i])
            {
                for(int k = minProfit;k >= 0; --k)//利润可以等于0,但是正常情况下利润是不小于0的,因此k - profit要和0取较大值
                {
                    dp[j][k] += dp[j - group[i]][max(0, k - profit[i])];//求计划数(求组合数,用+)
                    dp[j][k] %= mod;
                }
            }
        }
        return dp[n][minProfit];
    }
};

4.运行结果

在这里插入图片描述

似包非包的问题:

三、377. 组合总和 Ⅳ

1.题目简介

377. 组合总和 Ⅳ
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
在这里插入图片描述
在这里插入图片描述

2.解题思路

3.代码

class Solution {
public:
//1.多重背包问题:遍历背包要从左往右
//2.本质是求排列个数的问题:对顺序有要求,则先遍历背包再遍历物品
    int combinationSum4(vector<int>& nums, int target) {
        vector<int> dp(target + 1, 0);//dp[j]表示凑成总和为j的元素组合个数
        dp[0] = 1;
        for(int j = 0;j <= target; ++j)
        {
            for(int i = 0;i < nums.size(); ++i)
            {
                if(j >= nums[i] && dp[j] < INT_MAX - dp[j - nums[i]])
                dp[j] += dp[j - nums[i]]; //计算组合数、排列数用+
            }
        }
        return dp[target];
    }
};

4.运行结果

在这里插入图片描述

四、96. 不同的二叉搜索树

1.题目简介

96. 不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
在这里插入图片描述

2.解题思路

3.代码

class Solution {
public:
    int numTrees(int n) {
        if(n == 0 || n == 1) return 1;
        if(n == 2) return 2;
        vector<int> dp(n + 1, 0);//dp[i]表示当有i个节点时,它所能形成的二叉搜索树的种数
        dp[0] = 1;//空树
        dp[1] = 1;//只有一个根节点
        dp[2] = 2;
        for(int i = 3;i <= n; ++i)
        {
            int left = i - 1, right = 0;//left是左子树的节点个数,right是右子树的节点个数
            while(left >= 0)
            {
                dp[i] += dp[left--] * dp[right++];
            }
        }
        return dp[n];
    }
};

4.运行结果

在这里插入图片描述


总结

今天是算法练习的第17天。
及时当勉励,岁月不待人 ,动态规划算法练习到此告一段落。
来源:力扣(LeetCode),著作权归领扣网络所有。
如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5分钟了解制造核心5大系统的联系

本篇&#xff0c;我们来快速了解一下制造行业核心的5大系统MES、ERP、WMS、PLM和SCADA究竟有怎么样的关系&#xff0c;它们是如何连接的。 上图粗略描述了MES、ERP、WMS、PLM和SCADA五大系统之间的连接关系。 不过&#xff0c;我们先从ERP系统开始&#xff0c;因为这是大部分制…

前端Vue自定义精美底部操作栏导航栏工具栏 可用于电商购物车底部导航

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。通过组件化开发&#xff0c;可以有效实现单…

Python实现PSO粒子群优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

java中CompletableFuture异步编程详解以及实践案例

文章目录 一、CompletableFuture的使用1、 创建CompletableFuture的方式2、 获得异步执行结果3、 对执行结果进行处理4、对执行结果进行消费5、异常处理6、 两组任务按顺序执行7、 两组任务谁快用谁8、 两组任务完成后合并9、 多任务组合 二、一个使用CompletableFuture异步编排…

【算法】区间合并类题目总结

文章目录 重叠区间&#xff1a;452. 用最少数量的箭引爆气球解法1——左边界排序解法2——右边界排序 无重叠区间&#xff1a;435. 无重叠区间解法1——左边界排序解法2——右边界排序 合并区间&#xff1a;56. 合并区间左边界排序这题为什么不能按照右边界排序&#xff1f;其实…

【数据结构与算法】图课后习题

题目 下面一共有七道有关图的课后习题&#xff0c;全部都是思路画图题并不是算法设计题故在此就一起列举出来了~ 1. 已知如下图所示的有向图&#xff0c;请回答下面几个问题 每个顶点的入/出度&#xff1b;邻接矩阵&#xff1b;邻接表&#xff1b;逆邻接表&#xff1b;强连通…

Hugging Face应用——图像识别

利用人工智能解决音频、视觉和语言问题。音频分类、图像分类、物体检测、问答、总结、文本分类、翻译等均有大量模型进行参考。 Eg1: 图像识别 图像分类是为整个图像分配标签或类别的任务。每张图像预计只有一个类别。图像分类模型将图像作为输入并返回有关图像所属类别的预测…

OPPO手机上怎么设置阴历或阳历生日提醒?

有不少手机用户现在使用的都是OPPO这个品牌的手机&#xff0c;并且绝大多数用户都表示OPPO手机是比较好用的&#xff0c;不过也有一部分用户在使用手机的过程中遇到了一些问题&#xff0c;例如不知道在OPPO手机上怎么设置阴历或阳历生日提醒&#xff0c;这应该怎么办呢&#xf…

基于matlab开发和评估停车场场景中的视觉定位算法(附源码)

一、前言 本示例展示了如何使用虚幻引擎模拟环境中的合成图像数据开发视觉定位系统。 获取基本事实以评估定位算法在不同条件下的性能是一项具有挑战性的任务。与使用高精度惯性导航系统或差分GPS等更昂贵的方法相比&#xff0c;不同场景下的虚拟仿真是一种经济高效的方法来获…

数字化时代,到底如何认识商业智能BI?

数字化时代&#xff0c;商业智能BI对于企业的落地应用有着巨大价值&#xff0c;逐渐成为了现代企业信息化、数字化转型中的基础建设。 我曾经看到有人在讨论过商业智能BI的部署对于企业是否有实际意义&#xff0c;现在市场的数据已经证明商业智能BI在商业世界中&#xff0c;在…

使用Docker安装RabbitMQ并实现入门案例“Hello World”

RabbitMQ官方文档&#xff1a;RabbitMQ Tutorials — RabbitMQ 一、RabbitMQ安装&#xff08;Linux下&#xff09; 你可以选择原始的方式安装配置&#xff0c;也可以使用docker进行安装&#xff0c;方便快捷&#xff01; 1. 安装docker 没有docker的先安装一下docker&#x…

谷歌和edge浏览器升级到94及以上版本后反复提示安装pageoffice客户端

原因&#xff1a;Chrome开发团队以网络安全为由&#xff0c;强推ssl证书&#xff0c;希望所有部署在公网的网站&#xff0c;全部改用https访问&#xff0c;所以最新的谷歌和edge升级到94版本后对公网上的http请求下的非同域的http请求进行了拦截&#xff0c;于是就出现了目前遇…

一分钟告诉你国内和国外的ai绘画软件哪个好

前几天&#xff0c;我在一次聚会上偶然听到朋友们谈论起创作ai绘画的问题&#xff0c;大家都很热衷于用国内的ai绘画软件来生成自己喜欢的艺术作品&#xff0c;但又不知道国内和国外的ai绘画软件哪个好。正当我们陷入无尽的思考中时&#xff0c;其中一位朋友突然站出来说&#…

【计算机网络】1.5——计算机网络的体系结构

计算机网络的体系结构 概述 计算机网络的体系结构是计算机网络及其构建所应完成功能的精确定义 考题 不属于网络体系结构所描述的内容的是 A、网络的层次 B、每层使用的协议 C、协议的内部实现细节 D、每层必须完成的功能 这些功能的「实现细节」&#xff0c;是遵守这种体系…

SPEC CPU 2017 Ubuntu 20.04 LTS cpu2017-1_0_5.iso 安装、测试 单核成绩 笔记

环境 $ gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMESnvptx-none:amdgcn-amdhsa OFFLOAD_TARGET_DEFAULT1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pk…

vue3中的computed和watch

一、computed 1. vue2和vue3中计算属性用法对比 Vue2中的计算属性 Vue2中的计算属性是通过在Vue实例的computed选项中定义函数来创建的。计算属性会根据依赖的响应式属性进行缓存&#xff0c;只有当依赖的属性发生变化时&#xff0c;计算属性才会重新求值。 举个例子&#x…

【环境配置】Conda报错 requests.exceptions.HTTPError

问题&#xff1a; conda 创建新的虚拟环境时报错 Collecting package metadata (current_repodata.json): done Solving environment: done# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<…

OpenCVForUnity(二)基本图像容器Mat

这里写目录标题 前言Mat指针引用说明存储的方式如何创建一个Mat对像 前言 今天继续学习OpenCV的基本单位Mat. 学计算机的同学都知道在计算机中,你所看到的一切其都是数据的呈现.期最底层的本质皆是0和1的构成的.当然图片,视频等等也不例外.我们用相机,扫描仪核磁共振成像等方式…

OpenAI深夜放大招,GPT4 API全面开放并弃用一系列旧模型

GPT-4 API 现已向所有付费 OpenAI API 客户开放。GPT-3.5 Turbo、DALLE 和 Whisper API 现已普遍可用&#xff0c;我们宣布了一些旧型号的弃用计划&#xff0c;这些型号将于 2024 年初退役。 ✅ GPT4 API面向付费用户开放&#xff0c;不需要再额外申请,并且具有8K上下文&#…

bash文件输入到txt文件中

bash test_bct.sh >> test.txt结果如下