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

news2025/1/10 10:21:26

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/172479.html

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

相关文章

【Pytorch基础(2)】张量的索引,切片与维度变换

一、张量的维度索引 张量的索引是从第零维度开始的。让我们来创建一个四维的张量做举例说明&#xff1a;torch.Tensor(2,3,64,64) 此时&#xff0c;这个张量可以表示两张边长为64的正方形彩色图像&#xff0c;具体来说&#xff0c;张量的第零维表示图像的数量&#xff1b;第一…

Apollo星火计划学习笔记——Control 专项讲解(LQR)

文章目录1. 算法相关基础1.1 一阶倒立摆1.2 二自由度车辆横向跟踪偏差模型1.3 车辆横向跟踪偏差模型1.4 车辆横向跟踪偏差倒车模型1.5 轮胎侧偏角与侧偏刚度1.6 LQR 线性二次型问题:2. LQR代码解析2.1 WriteHeaders&#xff08;调试过程中的状态量&#xff09;2.2 LatControlle…

Android APK 瘦身

Android APK 瘦身的几个方法将项目中的图片由png、jpg转为webp格式。如下操作&#xff1a;1.1选中图片或者含有图片的文件夹 右键选择Convert toWebP..1.2根据自身情况选择有损压缩还是无损压缩备注&#xff1a;官网连接&#xff1a;https://developer.android.google.cn/studi…

leetcode-每日一题-强密码检验器II(简单,数学逻辑)

如果一个密码满足以下所有条件&#xff0c;我们称它是一个 强 密码&#xff1a;它有至少 8 个字符。至少包含 一个小写英文 字母。至少包含 一个大写英文 字母。至少包含 一个数字 。至少包含 一个特殊字符 。特殊字符为&#xff1a;"!#$%^&*()-" 中的一个。它 不…

Golang 从菜鸟到大咖的必经之路_GO 语言的转义字符、注释、规范和代码风格要求

目录 一、GO 语言转义字符 A.Golang 常用的转义字符&#xff08;escape char&#xff09;: B.课程练习 二、Go 语言注释&#xff1a; A.注释&#xff08;Comment&#xff09;: B.Go 语言中的注释类型&#xff1a; C.注释不会被编译 D.shifttab 三、规范的代码风格要求…

聚焦儿童羽绒服产业,看用友YonSuite打造领先实践的数智创新小灯塔

有一种冷“是妈妈觉得你冷”。每每想起小时候&#xff0c;为了应对寒冷的冬季&#xff0c;都会“全副武装”&#xff0c;裹得厚厚的&#xff0c;里三层外三层。 放到如今&#xff0c;有了羽绒服的萌娃们&#xff0c;已不再像我们当年一样穿得厚厚的了。现在的年轻爸妈喜欢装扮…

Udev 为设备节点起别名

查看设备信息&#xff1a; 操作udev&#xff0c;可以使用udevadm命令&#xff0c;如果我们要查看/dev/sda 设备节点信息&#xff0c;我们可以使用下面命令&#xff1a; 命令&#xff1a;udevadm info -a --namesda rootubuntu:/sys/kernel/debug/usb# udevadm info -a --nam…

【C语言】文件操作(1)

文件操作一、关于文件的基础知识1.为什么要学习文件2.什么是文件3.文本文件与二进制文件二、文件的打开和关闭1. 文件指针2.文件的打开和关闭3.文件结尾三、文件的顺序读写1.fputc与fgetc2.fputs与fgets3.fprintf与fscanf4.fwrite与fread5.三个标准流一、关于文件的基础知识 1…

低代码平台的优缺点

全文 1518 字 阅读时间约 5 分钟 本文首发于码匠技术博客 目录 低代码平台的优点 低代码平台的缺点 写在最后 低代码工具大大减少了开发者需要编写的代码量&#xff0c;通过增加可复用代码和组件的数量来帮助企业适应发展需求&#xff0c;设计和部署自定义应用程序以紧跟市…

科研快报|二代加三代扩增子测序探究苏铁植物根部复杂微生物群落组成

背景介绍苏铁俗称铁树&#xff0c;是地球上现存最古老的活化石植物&#xff0c;也是种子植物中最原始的种群。我国是世界上苏铁植物资源最丰富的国家之一&#xff0c;本文对我国的特有种德保苏铁&#xff08;Cycas debaoensis&#xff09;和仙湖苏铁&#xff08;Cycas fairylak…

【复习 自用】JavaScript知识汇总(基础版)

注&#xff1a;之前学过JavaScript&#xff0c;本贴仅用于复习(自用)&#xff0c;建议没基础的朋友先学基础。会混入typescript&#xff01; 更新中~~~~~~~~~~ 对象.属性和对象[‘属性’]的区别&#xff1a;总的来说没啥区别&#xff0c;但是&#xff0c; &#xff01;&#…

办公必备的快捷键,轻松助你键步如飞

作为职场人&#xff0c;你不会只会用Ctrl C和Ctrl V吧&#xff1f;掌握更多的办公快捷键&#xff0c;可以大大提高工作效率&#xff01;今天教大家几个好用的快捷键&#xff01;现在收收藏起来吧&#xff01;快捷键一&#xff1a;winL&#xff08;锁屏&#xff09; 电脑锁屏可以…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(功率表)】

目录 序言 &#x1f34d;放置虚拟仪器仪表 &#x1f349;功率表 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0&#xff0c;打开如图所示的启动界面&#x…

opencv的图像基本操作_2

import cv2 #图像BGRimport numpy as npimport matplotlib.pyplot as plt #Matplotlib是RGB腐蚀操作kernel np.ones((3,3), np.uint8) #选择3*3卷积核&#xff0c;3*3括起来&#xff0c;(3,3)erosion cv2.erode(img, kernel, iterations 1) #erode腐蚀函数&#xff0c; iter…

【LeetCode】生命游戏 [M](矩阵)

289. 生命游戏 - 力扣&#xff08;LeetCode&#xff09; 一、题目 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个…

2023年mybatis常见面试题10道

1. MyBatis是什么&#xff1f;Mybatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生…

Hyper-V三种虚拟网络类型的理解

Windows 10除家庭版之外都内置了Hyper-V&#xff0c;但是Win10系统上Hyper-V虚拟网络的设置方法却与之前版本的Hyper-V有些不同&#xff0c;最近在折腾了无数遍之后&#xff0c;总算有些心得&#xff1a;先说说虚拟网络的三种类型。Hyper-v支持外部、内部、专用三种网络&#x…

蓝桥杯STM32G431RBT6学习——定时器中断

蓝桥杯STM32G431RBT6学习——定时器中断 前言 从网络上的资料来看&#xff0c;蓝桥杯嵌入式好像并不考外部中断&#xff08;毕竟通常只是个按键应用&#xff09;&#xff0c;因此跳过进行定时器的学习。 STM32单片机的定时器通常分为高级定时器、通用定时器、基本定时器三种&…

111、【树与二叉树】leetcode ——669. 修剪二叉搜索树:递归法(C++版本)

题目描述 解题思路 本题的关键是用好递归这个结构&#xff0c;用好每次他向下的遍历和返回的值。每一次递归时&#xff0c;相当于解决与之前相同的问题&#xff0c;因此先按某一种类子问题进行讨论&#xff08;仅有三个结点的满二叉树&#xff09;&#xff0c;当递归的方式向下…

二本学历5年经验的程序员,出去面试被碾压~

目录 1、从一个求职案例引入2 、学历差距&#xff1a;面试官的第一印象3、公司背景差距&#xff1a;你的人生名片4、技术差距&#xff1a;硬核能力的欠缺5、架构能力的差距6、面试结果的分析 这篇文章&#xff0c;聊一个很多人感兴趣的话题&#xff0c;小公司的Java工程师和大…