Leetcode:416. 分割等和子集、1049. 最后一块石头的重量 II(C++)

news/2025/2/16 3:35:42/

目录

416. 分割等和子集

问题描述:

实现代码与解析:

动态规划(01背包问题):

原理思路:

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

问题描述:

实现代码与解析:

动态规划(01背包问题):

原理思路:


416. 分割等和子集

问题描述:

        给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

实现代码与解析:

动态规划(01背包问题):

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;//求和for(int i = 0; i < nums.size(); i++){sum += nums[i];}if(sum % 2 == 1) return false;//奇数显然不行int target = sum / 2;//所求值//01背包vector<int> dp(target + 1, 0);     for(int i = 0; i < nums.size(); i++){for(int j = target; j >= nums[i]; j--){dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);}}if(dp[target] == target) return true;else return false;}
};

原理思路:

        此题我们只要找出子集和为总和的一半就说明该数组符合题目条件,因为只要找出了一半,那另一半一定是与之相等的。

        我们可以把此看看作01背包问题,当容量为数组和的一半的背包,其最大价值正好也等于数组和的一半,就说明此数组符合条件。此题数组的值大小既是背包问题中物品的体积(质量),又是其价值。

        然后就是背包的遍历了,这里我们用的是一维优化的代码,比较简洁和好写,具体可以直接我发的

动态规划:0-1背包问题 | 详细原理解释 | 代码及优化(C++)_Cosmoshhhyyy的博客-CSDN博客的文章。

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

问题描述:

        有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x

        最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0

示例 1:

输入:stones = [2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。

示例 2:

输入:stones = [31,26,33,21,40]
输出:5

实现代码与解析:

动态规划(01背包问题):

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(target + 1, 0);//01背包遍历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];}
};

原理思路:

        与上一题基本相同,简单来说就是任意选 i 块石头,使得他们的重量趋近于总重量的一半,因为这样和另一半抵消的差值就是最小的。


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

相关文章

【Leetcode】面试题 08.05. 递归乘法、HJ55 挑7

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 面试题 08.05. 递归乘法 HJ55 挑7 面试题 08.05. 递归乘法 面试题 08.05. 递归乘法 题…

笔记:Space-time Neural Irradiance Fields for Free-Viewpoint Video

论文标题&#xff1a;自由视角的时空神经辐射&#xff08;发光&#xff09;场 创新点 使用RGBD单目视频&#xff08;2.5D&#xff09;表示时空。引入对场景深度的监督解决运动模糊问题。 &#xff08;本文仅介绍对NeRF的改进部分&#xff09; 深度重建损失 问题&#xff1…

npm的知识要点

前端开发趋向于分散隔离&#xff0c;多以组件、包的形式来进行。虽然不使用node、npm、webpack、babel等工具依然可以进行前端开发&#xff0c;但这是远离和拒绝新技术、新理念的做法。 npm(node package manage)是基于共享理念的实践、基于node的JavaScript编写的包管理工具&a…

字节跳动抖音推荐算法实习生一面凉经

面试大概50分钟 本来投的是头条开发岗位&#xff0c;不知为何被捞到了推荐算法岗位。多位推荐算法hr一直约我面试&#xff0c;说经历和他们部门契合。我从年底推到年后&#xff0c;最后答应面试&#xff0c;这也是读研以来第一次面试。大概是自己准备不充分&#xff0c;一面就…

模拟(一)回型矩阵、螺旋矩阵

回型矩阵_牛客题霸_牛客网 描述 给你一个整数n&#xff0c;按要求输出n∗n的回型矩阵 输入描述&#xff1a; 输入一行&#xff0c;包含一个整数n 1<n<19 输出描述&#xff1a; 输出n行&#xff0c;每行包含n个正整数. 示例1 输入&#xff1a; 4 输出&#xff1a; 1 2 3 4…

5G NR R16 SPS

一 简介 今天给大家介绍一个R16的小topic&#xff1a;SPS——Semi-persistent Scheduling(半持续调度)&#xff0c;与传统的Dynamic Scheduling(动态调度)相对应。 首先解释什么是SPS&#xff0c;我们知道目前常用的调度方式是动态调度&#xff0c;也就是一个DCI指示一个PDSC…

【内网安全-隧道搭建】内网穿透_Frp上线、测试

目录 Frp&#xff08;简易上线&#xff09; 1、简述&#xff1a; 2、工具&#xff1a; 3、使用&#xff1a; 1、准备&#xff1a; 2、服务端&#xff08;公网&#xff09;&#xff1a; 2、客户端&#xff08;内网&#xff09;&#xff1a; 3、测试方法&#xff1a; 4、…

乾元通多卡聚合通信设备保障生态环境监测网络

乾元通多卡聚合通信设备保障生态环境监测网络 针对目前城市大气环境监测网格化建设&#xff0c;推出的新一代城市网格化大气环境监测系统&#xff0c;可以实现城市区域环境多维一体化监测管理&#xff0c;该设备主要用于监测大气环境中的PM10、TSP、PM2.5等颗粒物浓度&#xff…