day43|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

news2024/11/15 17:36:04

1049. 最后一块石头的重量 II

1.代码

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum = 0;
        for(int i: stones) {
            sum += i;
        }
        int t = sum;
        sum = sum /2;
        vector<int>f(sum + 1);
        for (int i = 0; i < stones.size(); i++) {
            for (int j = sum; j >= stones[i]; j--) {
                f[j] = max(f[j], f[j - stones[i]] + stones[i]); 
            }
        }
        return t - f[sum] - f[sum];
    }
};

2.思考

根据题目的意思,就是不断抵消石头,直到抵消为一个石头时停止,有很多种抵消石头的方法,求出最后石头重量最小的抵消石头的方法的石头重量。

如何求呢?我们可以把这些石头看成两堆,两堆相减就是最后一个石头的重量了,因为会不断抵消,可以自己模拟一下。

所以求出中间值,那个方法分出的更小的那一堆最接近中间值就是正确的

就可以转化成01背包问题:选几个物品,求出不超过体积的最大价值

这道题和切割等和子集不同的是这道题是最接近中间值而不是等于中间值

3.动规五部曲

先求出中间值sum = sum/2 , 不用管奇数和偶数

1,确定dp数组的含义

dp[i]相当于最大体积为i时的最大价值,这里是从数组中挑几个值,不超过i的情况下值的总和是多少

2.确定递推公式

当取每一个物品时可以表现为取它还是不取它,

不取它:dp[j] = dp[j]

取它: dp[j] = dp[j - stones[i]] + stones[i] |这里的空间和值是相同的,取这个石头必须要留足够存放这个石头的空间

3.初始化

当小于当前取得物品时就不能取了,需要为0, 可以在遍历顺序中判断

4.确定遍历顺序

第一层循环是取出每一个石头放到不同的背包中,直到把所有石头放完为止

第二层就是遍历所有可以放的下当前石头的背包,确定要不要放当前石头,逆序遍历防止重复放石头,因为会复用之前遍历的背包

5.模拟


494. 目标和

1.代码

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = 0;
        for (int i: nums) sum += i;
        //一共有nums.size个数,设加法总和为x, 减法的总和为 -(sum - x)
        if (abs(target) > sum) return 0;
        if ((target + sum) % 2 == 1) return 0;
        int x = (target + sum) / 2;
        vector<int>f(x + 1, 0);
        f[0]  = 1;
        for (int i = 0; i < nums.size(); i++) {
            for (int j = x; j >= nums[i]; j--) {
                f[j] += f[j - nums[i]];
            }
        }
        return f[x];
    }
};

2.思考

一个数组中每个元素可以变换符号,变换符号后每个元素相加等于目标值的个数有多少个,

可以看出一部分是正数,一部分是负数,但是正数和负数的值固定才能相加等于一个固定值,设正数值之和相加等于x,那么负数就能够确定为-{num-x},所以我们可以转化成,选出几个值相加,之和等于目标值的有多少个。可以用01背包求出

这是求个数

3.递归五部曲

1.确定dp数组和其含义

dp[i]代表相加后x等于j的次数

2.确定递推公式

因为加每一个物品时都有可能到达体积j,为了算出到达i的相加方案数,每次都需要加上f[j - nums[i]]这个方案数就能得到总方案数f[i] += f[i - nums[i]];

3.初始化

每次加不会加上而外的值,所以需要在前面初始化。几乎都是从f[0]得到的, f[0]代表到达0的方案数,所以为空集,f[0] = 1

4.遍历顺序

第一层是武品,第二层逆序背包

5.模拟


474. 一和零

1.代码

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>>f(m + 1, vector<int>(n + 1, 0));
        for (string str: strs) {
            int oneNum = 0;
            int zeroNum = 0;
            for (char ch: str) {
                if (ch == '0') zeroNum++;
                else oneNum++;
            }
            for (int i = m; i >= zeroNum; i--) {
                for (int j = n; j >= oneNum; j--) {
                    f[i][j] = max(f[i][j], f[i - zeroNum][j - oneNum] + 1);
                } 
            }
        }
        return f[m][n];

    }
};

 2.递归五部曲

1.确定dp数组和其含义

sp[i][j] 就是i个0和j个1的集合元素个数

2.确定递推公式

当每次拿物品时就会有一些0和一些1,要么选这个数要么不选就有两种方式

选f[i][j] = f[i - zeroNum][j - oneNum] + 1,增加一个元素

不选f[i][j] = f[i][j]

3.确定初始化

在遍历顺序中确定

4.遍历顺序

第一层就是遍历物品

第二层就是不超过总共的1和0的情况下遍历体积,

5.模拟

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

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

相关文章

怎样防止数据怎么泄露了

近年来&#xff0c;各种数据泄露事件越演越烈&#xff0c;数据泄密日益成为企业管理者的梦魇。数据泄密不仅给企业带来严重的直接经济损失&#xff0c;而且还在品牌价值、投资人关系、社会公众形象等多方面造成损害。因此&#xff0c;要想提升企业数据的安全性&#xff0c;就要…

容器虚拟化技术Docker(二)mysql主从配置案例、redis集群搭建及扩容、缩容案例详解

容器虚拟化技术Docker&#xff08;二&#xff09;mysql主从配置案例、redis集群搭建及扩容缩容案例详解 对docker不熟悉的可以参考&#xff1a; 容器虚拟化技术Docker&#xff08;一&#xff09;简介、安装、常见命令、数据卷、安装常规软件 1、Docker安装mysql主从复制 &am…

2023年微软发布的第一个补丁都有什么?

微软于 10 日发布了 2023 年的第一个更新&#xff0c;修复了其Windows操作系统和其他软件中的近 100 个安全漏洞。 2023 年第一个补丁星期二的亮点包括&#xff1a;Windows 中的零日漏洞、美国国家安全局报告的打印机软件缺陷&#xff0c;以及允许未经身份验证的远程攻击者建立…

建木CI自定义节点说明

数据导出导入可以看下 https://gitee.com/jianmu-runners/jianmu-runner-mysq建木节点基于docker 镜像执行 1. 安装 docker & docker-compose 参考 https://blog.csdn.net/pushiqiang/article/details/78682323 https://docs.docker.com/compose/install/other/2.安装&a…

JDK安装与环境变量配置

经验 先使用LightlyLightlyLightly自带的JDKJDKJDK编辑器&#xff0c;进行运行代码&#xff0c;后续学习深入后&#xff0c;再继续探讨JDK的安装&#xff0c;开发大型项目工程时候会自己使用都行啦的回事与打算。 附带JDK安装链接 安装链接: JDK安装链接 总结 慢慢的将JDKJ…

9、Ubuntu安装Tomcat配置部署web

1、安装 Java 这里使用Ubuntu22.04 其他版本也差不多 tomcat是基于Java开发的&#xff0c;安装前需确保已经按照了jdk apt update apt install openjdk-8-jdk 验证是否按照成功 java -version 环境变量 2、安装 Tomcat 下载链接 Tomcat: Apache Tomcat - Apache Tomcat …

Python备份网络设备配置实验-ensp

一、实验简介 实验拓扑 简介 本实验为物理主机(windows电脑)通过物理主机的环回口虚拟网卡与ENSP模拟器中的Cloud建立通信,再与Cloud下面连接的虚拟网络设备通信。从而实现物理主机上面的python脚本抓取ENSP中网络设备的配置信息,并保存在物理主机磁盘指定位置。 本实验…

零入门容器云实战之测试环境介绍、网盘、联系方式

本篇文章主要介绍: 对测试环境的要求介绍一下我的测试环境都有哪些设备&#xff0c;分享一下我在学习中是如何测试的。 1、网盘资源 我已经将相关资源上传到了网盘 零入门容器云网络实战 链接: https://pan.baidu.com/s/1nPLRkAwjItAHmtEU2T1F4g 提取码: rrpd 2、技术交流…

vue3实现一个抽奖小项目

前言 在公司年会期间我做了个抽奖小项目&#xff0c;我把它分享出来&#xff0c;有用得着的可以看下。浏览链接&#xff1a;http://xisite.top/original/luck-draw/index.html项目链接&#xff1a;https://gitee.com/xi1213/luck-draw (欢迎star!)项目截图&#xff1a; 实现目…

UNIAPP学习点滴记录

一、事件处理 1&#xff09;tap和click的区别 在HbuilderX中&#xff0c;两者都是点击时触发事件;不同的是: 1.click是组件被点击时触发&#xff0c;会有约300ms的延迟(内置处理优化了) 2.tap是手指触摸离开时触发&#xff0c;没有300ms的延迟&#xff0c;但是会员事件穿透…

两种分类方法的比较

一个物体既可以按照元素分类法去分类&#xff0c;也可以按照形态分类法去分类。但似乎很难用元素去分类形态&#xff0c;也很难用形态去分类元素。 想用元素分类形态就得加入位置变量。而所谓的位置变量显然是一种空间变量。是粒子在空间中&#xff0c;所以所谓的空间变量似乎…

SpringBoot学习笔记【part14】Spring Cache + Redis 集成缓存数据

Spring Cache 是一个非常优秀的缓存组件&#xff0c;方便切换各种底层Cache&#xff08;如&#xff1a;redis&#xff09; 使用Spring Cache的好处&#xff1a; 提供基本的Cache抽象&#xff0c;方便切换各种底层Cache&#xff1b;通过注解Cache可以实现类似于事务一样&#x…

基于MMdet的Cascade MASKRCNN 原理及源码解读

目录 一、原理 二、源码解读 1、总参数文件configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py 2、模型配置字典../_base_/models/cascade_mask_rcnn_r50_fpn.py 3、基于检测器类搭建模型 CascadeRCNN 4、backbone&#xff08;ResNet&#xff09; 5、neck&am…

深度学习数据标注_Lableme

图像标注工具Lable labelme 是一款图像标注工具&#xff0c;主要用于神经网络构建前的数据集准备工作&#xff0c;因为是用 Python 写的&#xff0c;所以使用前需要先安装 Python 集成环境 anaconda。 anaconda 安装 anaconda下载地址如下&#xff1a; https://www.anaconda…

数据结构:循环链表、双向链表和有序表

1、循环链表 循环链表(circular linked list)是线性表的另一种形式的链式存储表示。它的特点是表中最后一个结点的指针域指向第一个结点,整个链表成为一个由链指针相链接的环。对于循环链表,通常还在表中第一个结点之前“附加”一个“头结点”,并令“头指针”指向最后一个结点…

【算法基础】基础算法之排序

&#x1f63d;PREFACE&#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐ 评论&#x1f4dd;&#x1f4e2;系列专栏&#xff1a;https://blog.csdn.net/weixin_59954106/category_12108349.html&#x1f4aa;种一棵树最好是十年前其次是现在目录 1.快排 步骤 思路方法 题目…

ABB机器人仿真软件robotstudio v6.08安装教程

ABB机器人仿真软件robotstudio v6.08安装教程 具体步骤可参考以下内容: 注意:安装之前,最好将电脑的名称改为英文,否则可能会安装不成功, 第1步:将下载的安装包解压缩, 第2步:找到解压后的文件中的RobotStudio6.08, 第3步:找到“setup.exe”, 第4步:软件正在…

Open3D 深度图像转点云数据(Python版本)

文章目录 一、简介二、代码实现三、实现效果测试数据参考文献一、简介 深度图像的获取有很多方式,如激光雷达、结构光以及深度相机等,网上很多教程都是在讲解通过深度相机所获取的深度图像转换为三维点云数据(相机内参、外参),但是通过激光雷达所生成的深度相机通常与相机…

数据分析-决策树

我们生活中遇到很多问题其实把他们抽象成一个数学模型&#xff0c;都可以抽象为一个决策树。&#xff08;比如打篮球&#xff09; 我们总是会经历两个阶段&#xff1a;构造、剪枝 构造 什么是构造呢&#xff1f;构造就是生成一棵完整的决策树。简单来说&#xff0c;构造的过程…

【MySQL基础】MySQL多表操作详解

序号系列文章4【MySQL基础】MySQL表的七大约束5【MySQL基础】字符集与校对集详解6【MySQL基础】MySQL单表操作详解7【MySQL基础】运算符及相关函数详解文章目录前言MySQL多表操作1&#xff0c;多表关系1.1&#xff0c;一对一1.2&#xff0c;一对多1.3&#xff0c;多对多2&#…