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

news/2024/10/18 2:41:24/

Day43

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

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

题目链接:1049. 最后一块石头的重量 II
石头相撞,得到最小重量 -> 分成重量近似的两堆 -> 得到结果

分成重量近似的两堆可以用 01背包来求得(同理于416.分割等和子集

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum = accumulate(stones.begin(), stones.end(), 0);int target = sum / 2;vector<int> dp(target + 1, 0);for (auto& stone : stones) {//因为weight[i]等于value[i],所以才可以这么写for (int j = target; j >= stone; --j) {dp[j] = max(dp[j], dp[j - stone] + stone);}}return sum - 2 * dp.back();}
};
sum - 2 * dp.back();

其中,dp[j] 的意思是表示容量为 j 的背包的最大重量,dp.back() 为一堆中最大重量,则另一部分的重量为 sum - dp.back(),由于 sum / 2 是向下取整,因此 sum - dp.back() 大于等于 dp.back()。因此最终结果为 (sum - dp.back()) - dp.back()


494. 目标和

题目链接:494. 目标和
分出加法和减法两个集合 -> 整个集合中,可以分出多少个加法(减法)-> 加法属于背包,集合属于物品(01背包问题

如有 nums : [1, 1, 1, 1, 1]
dp[j]:装满容量为 jdp[j] 种方法

递推公式:根据每一个状态来确定 dp[j] 有多少种方法,状态为 dp[j - nums[i]],因为 j 是所对应的容量,每个 j - nums[i] 是剩下的容量,一直递归到从 dp[0] 开始。最终求和得到公式为dp[5] = dp[0] + ... + dp[4] 也就是 dp[j] += dp[j - nums[i]]
这个递推公式 dp[j] += dp[j - nums[i]] 不与01背包的滚动数组 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) 完全一样,是因为 dp 公式表示的是多少种方法

初始化dp[0] = 1,有一种方法。 服务于递推公式。

对于题意来说,如何求出加法集合中的元素。

集合为 a , b , c , d a, b, c, d a,b,c,d,有如下公式:
( a + b + c + d ) = s u m ( a + b + c − d ) = t a r g e t \begin{aligned} (~a + b + c + d~) &= sum \\ (~a + b + c - d~) &= target \end{aligned} ( a+b+c+d )( a+b+cd )=sum=target
根据上述公式,有 ( s u m + t a r g e t ) / 2 (sum + target) / 2 (sum+target)/2 可以求出加法集合的和。当然, ( s u m − t a r g e t ) / 2 (sum - target) / 2 (sumtarget)/2可以求出减法集合的和。

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum = accumulate(nums.begin(), nums.end(), 0);if (abs(target) > sum/*target超过sum*/ || (sum + target) % 2 == 1/*sum、target和不能被2整除,表示不存在*/) return 0;vector<int> dp{1};dp.resize((sum + target) / 2 + 1);for (int i = 0; i < nums.size(); ++i) {for (int j = (sum + target) / 2; j >= nums[i]; --j) {dp[j] += dp[j - nums[i]];}}return dp.back();}
};

474.一和零

题目链接:474.一和零
背包为有 m0n1。物品为各个子集。
与一般的01背包的不同之处为:通常的01背包的物体只有一个属性,就是weight。这个物体有两个属性:0 的个数和 1 的个数。

二维 dp 数组 dp[i][j],表示三个信息:装满 i0j1 最多需要 dp[i][j]个子集(根据题目所求来表示)

递推公式dp[i][j] = max(dp[i][j], dp[i - x][j - y] + 1)x0y1 表示物品的属性。+11 相当于value

初始化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 (auto& str: strs) {//计算每个物品的属性int x = count(str.begin(), str.end(), '0');int y = str.size() - x;for (int i = m; i >= x; --i) {//0for (int j = n; j >= y; --j) {//1dp[i][j] = max(dp[i][j], dp[i - x][j - y] + 1);}}}return dp.back().back();}
};


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

相关文章

java操作csv文件(读、写)

今天在做项目的时候&#xff0c;发现使用POI无法解析以csv文件结尾的文件&#xff0c;虽然csv文件能用Excel打开&#xff0c;但是csv文件没有像Excel一样有规定的电子表格形式&#xff0c;故使用POI无法解析csv文件&#xff0c;在网上找了一下&#xff0c;发现java有提供javacs…

CSV文件格式

CSV &#xff08;逗号分隔值文件格式&#xff09; 编辑 逗号分隔值&#xff08;Comma-Separated Values&#xff0c; CSV&#xff0c;有时也称为 字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字…

家庭云及其它(中)

硬件 基本上0bug老师对自己的需求还是比较清楚的&#xff0c;所以没有选择NAS产品&#xff0c;也没有选择企业级服务器都是很正确的。当然选择APU算是一个小失误&#xff0c;这个方案更适合做HTPC&#xff0c;而不是家用服务器&#xff0c;N550不论从功耗还是发热上&#xff0…

Hive 处理CSV格式文件数据

一般情况下对于CSV格式文件数据&#xff0c;有多种第三方SerDer来处理。本文采用CSVSerDe&#xff1a; 一、添加第三方SerDe 首先在Hive classpath中添加第三方SerDe JAR包&#xff0c;命令如下&#xff1a; hive> add jar /home/hadoopUser/cloud/hive/apache-hive-0.13.…

中兴echat_中兴高达推出新一代eChat小先锋e350

原标题&#xff1a;中兴高达推出新一代eChat小先锋e350 公网集群领域有一款机型人称"小钢炮"&#xff0c;发货量破30万台&#xff0c;广泛应用于城管、物业、交警、旅游及大型赛事&#xff0c;成为一个有口皆碑的传奇&#xff0c;获得过无数赞誉和荣耀。时至今日G180…

主控88NV1120开卡工具教程,镁光颗粒无法格式化、掉盘、开卡失败的偶然解决(修复)方法

事件背景&#xff1a;我自己之前有个usb3.0转SATA的移动硬盘&#xff0c;里面装着一个160G的机械硬盘&#xff0c;但几次霍霍下&#xff0c;坏块一堆&#xff0c;基本上难以正常使用&#xff0c;于是海鲜市场花了三十多淘了块240G的掉盘的SSD&#xff0c;品牌&#xff1a;金胜E…

c语言电子秤原理,电子秤设计电路图汇总(六款模拟电路设计原理图详解)

电子秤设计电路图(一) 工作原理 数显电子秤电路原理如图所示&#xff0c;其主要部分为电阻应变式传感器R1及IC2、IC3组成的测量放大电路&#xff0c;和IC1及外围元件组成的数显面板表。传感器R1采用E350~ZAA箔式电阻应变片&#xff0c;其常态阻值为350O。测量电路将R1产生的电阻…

python数据读取与可视化(1)——CSV格式

CSV格式文件读取与可视化 CSV格式文件读取与可视化 一 CSV二 如何得到CSV三 CSV文件的处理1 导入文件2 读取数据3 数据的可视化一些小问题的处理一点优化 一 CSV CSV文件以纯文本的形式储存数字和字母,各个数据之间一般用逗号作为分隔符。是一种通用的&#xff0c;相对简单的文…