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

news/2024/10/21 20:34:21/

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

最后一块石头的重量II

LeetCode题目:https://leetcode.cn/problems/last-stone-weight-ii/

题目中的背包理解

  可以将其中的一个子问题抽象冲背包问题,即题中要求求得最后一块儿石头的最小重量。则易得最小的情况应当是将所有石头的重量尽量均匀的分为两部分,然后相减得到的重量。因此,本题目的背包可以看做求sum/2容量下所能的得到的最大价值。(此时同样将重量等同看做价值)

背包DP思路

  按照五步进行分析,dp数组在本题目中的含义为可以取到数组中0-i个位置的数字时,容量为sum/2的背包能否装满。因此可以递推当前第i位置的j容量背包所能承载最大价值为:max(i-1位置容量背包的最大价值,i-1位置背包容量为j-第i个位置物品的容积时背包的最大价值 + 第i个位置的物品价值)。即dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]);。

  最后,根据递推公式可以执行正序的遍历得到结果,最后将结果进行(sum - dp[sum/2]) - dp[sum/2]即可,即剩余的石头减去一半容量背包所能得到的最多石头重量。

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {/* dp[i]代表第i个位置时候最大价值,依然按照 */int sum = 0;for (int i = 0; i < stones.size(); i++) {sum += stones[i];}vector<int> dp(sum/2 + 1,0);for (int i = 0;i < stones.size(); i++) {for (int j = sum/2 ; j >= stones[i]; j--){dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);}}return (sum - dp[sum/2]) - dp[sum/2];}
};

目标和

LeetCode题目:https://leetcode.cn/problems/target-sum/

  目标和总的来说,可以看作是装满一个指定容量的背包有多少种方法的问题。假设加法的总和为 x x x,那么减法对应的总和就是 s u m − x sum - x sumx。所以我们要求的是 x − ( s u m − x ) = t a r g e t x - (sum - x) = target x(sumx)=target,推得 x = ( t a r g e t + s u m ) / 2 x = (target + sum) / 2 x=(target+sum)/2

  因此,由以上推理,问题可以简化为:当可以取到x的值时,有多少种方法组成。即此时dp的容量上限为x,dp[i]意为容量为x时最多有多少种组合方法?因此可以看作一次性可以上i个台阶的上楼梯问题,所以递推公式为dp[j] += dp[j - nums[i]];同时,注意初始化的时候,当容量为0的时候一定有一种组合方法,其他则默认为0。

  最终两次循环第一轮循环物品价值,第二轮循环背包容量,代码如下:

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 (sum < abs(target)) return 0;if ((target + sum) % 2 == 1) return 0;int x = (target + sum)/2;vector<int> dp(x + 1, 0);dp[0] = 1;for(int i = 0; i < nums.size(); i++) {for (int j = x ; j >= nums[i]; j--) {dp[j] += dp[j - nums[i]];}}return dp[x];}
};

一和零

LeetCode题目:https://leetcode.cn/problems/ones-and-zeroes/

  该问题中存在二维的数组,因此可以看做是一个二维容量的背包问题。即每个物体有两个维度的重量需要在放置的时候注意(类似于老传奇里面放物品会算占的面积)。其他仍然属于01背包的最大放置问题。

  因此,由以上推理,问题可以简化为:当可以取到第x个物品时,此时dp的容量上限为i,j(二维),dp[i][j]意为二维容量分别为i和j时最多能放下多少物品?因此可以看作多算一个容量部分的01背包问题,所以递推公式为dp[i][j] = max(dp[i - x][j - y] + 1, dp[i][j]);同时,因为有max,注意初始化的时候应该为0,当容量为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 x = 0, y = 0;for (int i = 0; i < str.length(); i++) {if (str[i] == '0') x++;if (str[i] == '1') y++;}for (int i = m; i >= x; i--) {for (int j = n; j>= y; j--) {dp[i][j] = max(dp[i - x][j - y] + 1, dp[i][j]);}}}return dp[m][n];}
};

http://www.ppmy.cn/news/534173.html

相关文章

登录校验原理过程和统一拦截技术(Cookie、Sesstion 和JWT令牌)

一、登录校验 问题&#xff1a;在未登录情况下&#xff0c;我们也可以直接访问部门管理、员工管理等功能。由于浏览器与web服务器中的数据交互是通过HTTP协议的&#xff0c;而HTTP协议是无状态的–即每个页面中的请求和响应都是独立的&#xff0c;没有状态存在。所以我们需要进…

厨房用具,将吸目无背无侧旁

问了医生说没事就开了2盒贴的药口服的都没首一、年份 2013年二、车型爱丽舍也许适用于其它车型请考证三、项目侧方位停车四、入库车身向前行驶距离路边50公分到前停车线停车目而视辗转反侧旁敲侧击珠玉在侧道路侧目无背无侧旁推侧引转辗反侧侧足而立横峰侧岭明扬侧…

制定CRM战略流程是哪些?

CRM战略是企业为了提升核心竞争力&#xff0c;在市场、销售、客户管理等方面开展的一系列改善、创新或转型的措施。目的是建立和维护与客户的关系&#xff0c;增加企业的收入。那么&#xff0c;企业如何制定CRM战略呢&#xff1f; 1、深入了解客户需求 企业需要了解其目标客户…

MySQL ----主从复制、分离解析

文章目录 一、MySQL 主从复制1.1服务性能扩展方式1.2 MySQL的扩展什么是读写分离&#xff1f; 1.3为什么要读写分离呢&#xff1f;1.4什么时候要读写分离&#xff1f;1.5主从复制与读写分离1.6mysql支持的复制类型1.7主从复制的工作过程1.8MySQL 读写分离原理1.9目前较为常见的…

【计算机网络详解】——网络层(学习笔记)

&#x1f4d6; 前言&#xff1a;网络层它承担着网络间的数据传输和路由选择等核心任务&#xff0c;通过在传输层协议的基础上添加了路由和转发等功能&#xff0c;使得数据能够在全球范围内的互联网中自由流动。在这篇博客中&#xff0c;我们将深入探讨网络层的工作原理和具体实…

1.GPIO的工作原理

1.stm32引脚说明&#xff1a; 对于stm32f103zet6&#xff1a; 一共有7组io口&#xff1b;每组io口有16个io&#xff1b;一共有16*7112个io&#xff1b;分组情况为&#xff1a;GPIOA&#xff0c;GPIOB~GPIOG&#xff1b; 2.GPIO的基本结构&#xff1a; 3.GPIO的工作模式&…

XP访问WIN10共享打印机提示错误:操作无法完成,拒绝访问

XP系统添加打印机--连接到此计算机的本地打印机&#xff08;取消自动检测&#xff09;--创建新端口&#xff08;LOCAL port&#xff09;----输入端口名\\计算机名\打印机名。&#xff08;例如&#xff1a;\\adubei\\HP lasjet 1020&#xff09; 转载于:https://www.cnblogs.com…

win10共享打印机xp系统无法连接,拒绝访问解决办法

1.控制面板/添加删除程序/启动或关闭windows功能 #勾选SMB相关项 #xp系统就可用访问到。如提示拒绝访问&#xff0c;继续下面步骤。 2.添加打印机/添加网络打印机/找到共享的打印机&#xff0c;把地址复制出来。 3.修改一个已经安装的打印机&#xff0c;添加端口&#xff0c;端…