代码随想录刷题第43天

第一题是最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/,没啥思路,直接上题解了。本题可以看作将一堆石头尽可能分成两份重量相似的石头,于是问题转化为如何合理取石头,使其装满容量为石头总重量一半的背包,且每个石头只能取一次,这样就变成了一个01背包问题。其中石头的重量与价值相同,均为stones[i]。接下来按照动规五步曲进行分析,dp[j]表示容量为j的背包中可以装的最大重量为dp[j],对于第i块石头,可以取也可以不取,故dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]),初始化dp = 0,先遍历物品,再遍历背包即可。

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

第二题是目标和https://leetcode.cn/problems/target-sum/description/,可以假设加法总和为x,则减法总和为sum - x,题中指出x- (sum - x) = target,可得x = (target + sum)/2。此时题目转化为要装满容量为x的背包共有几种方法,且每个数的状态只能取一次,再次转化为01背包问题。根据动规五步曲,确定dp[j]表示装满容量为j背包的方法数量为dp[j]。当遍历到元素i时,想知道dp[j]的值,必须先知道背包中去掉numbers[i]时dp数组的值,由此反复,得到dp[j] += dp[j - numbers[i]]。初始化将dp[0] = 1,说实话我不是特别理解。遍历顺序依然是先物品后背包,背包从后往前遍历。

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum = 0;for (int i = 0; i < nums.size(); i++){sum += nums[i];}if ((target + sum) % 2 == 1) return 0;if (abs(target) > sum) return 0;int bagsize = (target + sum) / 2;vector<int> dp(bagsize + 1, 0);dp[0] = 1;for (int i = 0; i < nums.size(); i++){for (int j = bagsize; j >= nums[i]; j--){dp[j] += dp[j - nums[i]];}}return dp[bagsize];}
};

事实上该题的二维数组解法更为好懂,将其贴在下面:第三题是一和零https://leetcode.cn/problems/ones-and-zeroes/description/,本题的背包维度有两个:m和n,即如何选取元素使元素满足0、1的个数要求。利用动规五步曲:dp[i][j]为拥有i个0,j个1的元素个数。dp[i][j]可由去掉上一个字符串时dp[i - 0nums][j - 1nums]得出,即dp[i][j] = max(dp[i][j], dp[i - 0nums][j - 1nums] + 1)。由题意可知dp数组初始化为0即可,dp[0][0]=0也符合认知。遍历顺序依然不变。

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

由此可见,背包问题的维度一般有以下几种:在给定背包容量的情况下,装满背包的最大价值;能否装满;装满背包的方法数量;装满时背包中物品数量;尽可能装满的重量。

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

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

相关文章

【AI Agent系列】【MetaGPT多智能体学习】0. 环境准备 - 升级MetaGPT 0.7.2版本及遇到的坑

之前跟着《MetaGPT智能体开发入门课程》学了一些MetaGPT的知识和实践&#xff0c;主要关注在MetaGPT入门和单智能体部分&#xff08;系列文章附在文末&#xff0c;感兴趣的可以看下&#xff09;。现在新的教程来了&#xff0c;新教程主要关注多智能体部分。 本系列文章跟随《M…

五种主流数据库:常用字符函数

SQL 字符函数用于字符数据的处理&#xff0c;例如字符串的拼接、大小写转换、子串的查找和替换等。 本文比较五种主流数据库常用数值函数的实现和差异&#xff0c;包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。 字符函数函数功能MySQLOracleSQL ServerPostgreSQ…

Wagtail安装运行并结合内网穿透实现公网访问本地网站界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xf…

C++Lambda表达式介绍

C11中引入了Lambda表达式&#xff0c;Lambda表达式是一种匿名函数&#xff0c;它可以在需要函数的地方直接定义和使用&#xff0c;而无需显式地定义一个函数。 lambda表达式 Lambda表达式语法定义 [capture-list](parameters) -> return-type { statement } capture-lis…

cmake build

cmake -H. -Bbuild 这是使用 CMake 的命令行工具来配置项目的命令。具体来说&#xff1a; cmake 是 CMake 的命令行工具。-H. 表示 CMakeLists.txt 文件所在的源代码目录是当前目录 (.)。这个选项指定了 CMakeLists.txt 所在的路径&#xff0c;这样 CMake 就知道在哪里找到项目…

SQL Developer 小贴士:PL/SQL语法分析

对于SQL或PL/SQL中的语法错误和警告&#xff0c;SQL Developer可以用不同颜色的下划波浪线显示。 启用语法分析&#xff0c;可以用菜单Tool>Preferences>Code Editor>Completion Insight>Enable Semantic Analysis Info Tips 例如&#xff0c;以下的代码中&…

blender bvh显示关节名称

导入bvh&#xff0c;菜单选择布局&#xff0c;右边出现属性窗口&#xff0c; 在下图红色框依次点击选中&#xff0c;就可以查看bvh关节名称了。

微服务架构设计 | 如何设计高性能系统

一、引言 互联网时代&#xff0c;业务系统的主要特点是用户多、请求量大。尤其在中国这样拥有庞大用户基数的环境下&#xff0c;不用说阿里巴巴、京东这类需要满足双十一大促时每秒几万甚至几十万订单的系统&#xff0c;即使是一些垂直领域的业务系统&#xff08;如三甲医院的…

自考《计算机网络原理》考前冲刺

常考选择填空 1、计算机网络的定义&#xff1a;计算机网络是互连的、自治的计算机的集合。 2、协议的定义&#xff1a;协议是网络通信实体之间在数据交换过程中需要遵循的规则或约定 3、协议的3个要素 (1) 语法&#xff1a;定义实体之间交换信息的格式与结构&#xff0c;或…

设计模式六:策略模式

1、策略模式 策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使每个算法可以相互替代&#xff0c;使算法本身和使用算法的客户端分割开来&#xff0c;相互独立。 策略模式的角色&#xff1a; 策略接口角色IStrategy&#xff1a;用来约束一系列具体…

第一次开机开机动画结束后闪白屏

开机动画结束会闪下白屏&#xff0c;再进入launcher 思路 : 分析下从开机动画结束到launcher起来之间的流程步骤 从ZygoteInit.java开始分析 &#xff1a; SystemServer起来后会启动一些核心服务 attachApplication方法中主要创建了Application和Activity 接下里RootActivityC…

快速搭建网站原型!8款网站原型软件推荐

现在&#xff0c;基于云的软件已经逐渐成为主流&#xff0c;网站原型设计工具也不例外。与桌面版本相比&#xff0c;在线原型工具具有独特的优势&#xff0c;无论您使用Linux&#xff0c;Mac 或者Windows&#xff0c;都不需要安装就可以使用这些工具。下面小编就为大家推荐8款非…

c++入门学习⑧——模板

目录 前言 基本介绍 什么是模板&#xff1f; 作用 特点 分类 函数模板 语法 使用方式 注意事项 函数模板和普通函数区别 普通函数和函数模板的调用规则 局限性 类模板 语法 类模板的成员函数创建时机 类模板实例化对象 类模板实例化对象做函数参数 类模板成…

Node.js_基础知识(fs模块 - 文件操作)

写入 文件操作 流式写入:fs.createWriteStream(path[, options]) 可以减少打开关闭文件的次数适用于:大文件写入、频繁写入参数说明: path:文件路径文件夹操作: 调用mkdir方法:fs.mkdir(./a/b/c, err => {}) 递归创建文件夹:加参数recursive fs.mkdir(./a/b/c, {recu…

普中51单片机学习(LCD1602)

LCD1602 1602液晶也叫1602字符型液晶&#xff0c;它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若干个5x7或者5x10的点阵字符位组成&#xff0c;每个点阵字符位都可以用显示一个字符&#xff0c;每位之间有一个点距的间隔&#xff0c;每行之间也有间隔&#…

代码随想录算法训练营29期|day60 任务以及具体安排

第九章 动态规划part17 647. 回文子串 class Solution {public int countSubstrings(String s) {char[] chars s.toCharArray();int len chars.length;boolean[][] dp new boolean[len][len];int result 0;for (int i len - 1; i > 0; i--) {for (int j i; j < le…

【Spring连载】使用Spring Data的Repositories----存储库查询返回类型

【Spring连载】使用Spring Data的Repositories----存储库查询返回类型 支持的查询返回类型 支持的查询返回类型 下表列出了Spring Data存储库通常支持的返回类型。但是&#xff0c;有关支持的返回类型的确切列表&#xff0c;请参阅特定存储的文档&#xff0c;因为此处列出的某…

C++面试:死锁的危害、出现原因、解决方法

目录 死锁的危害 死锁出现的原因 死锁的解决方法 死锁是计算机科学中一个非常重要的概念&#xff0c;特别是在多线程、并发编程以及数据库管理系统等领域中。下面是关于死锁的危害、出现原因和解决方法的基础概述&#xff1a; 死锁的危害 资源浪费&#xff1a;死锁导致系统…

设计模式:模版模式

模板模式&#xff08;Template Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将一些步骤的具体实现延迟到子类中。模板模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 在模板模式中&#xff0c;将算法的…

C++ 高频考点

1. C/C内存有哪几种类型&#xff1f; C中&#xff0c;内存分为5个区&#xff1a;堆(malloc)、栈(如局部变量、函数参数)、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&#xff09;和常量存储区&#xff08;常量&…