笔记:代码随想录算法训练营day36:LeetCode1049. 最后一块石头的重量 II、494. 目标和、474.一和零

devtools/2025/3/6 1:12:46/

学习资料:代码随想录

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

力扣题目链接

思路:如何讲该问题转化为背包问题:还是对半分去碰,对半分去碰碰剩下的就是最小的。然后背包容量就是一半儿,物品重量等于物品价值等于stones[i]

和上一题不同的是return什么,这里返回碰完后的值即(sum-target)-(target),这里一定不会出现负数以为‘/’是向下取整

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(30*100/2+1,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]);//cout<<dp[j];}}return (sum-dp[target])-dp[target];}
};

494.目标和

力扣题目链接

如何将该题转换成背包问题,有一个小推导,假如分出来的正数是x,那么分出来的负数就是-(sum-x),两数相加等于target,就是x-(sum-x) = target;

交换一下,x = (target+sum)/2

求的结果是方法数,那么x为背包容量,物品的重量等于物品的价值等于nums[i]

定义:dp[i][j] 的表示前i个数能够满足:选子集(可以选0个数)求和等于x的方法数量

递推公式:dp[i][j]等于不放物品i正好满足j 的方法+放i(需要把i的容量先让出来)正好满足j的方法

初始化:第一行,当然0,0处不放是一种方法,然后如果物品0能满足背包容量为k的话,在0,k处方法应该也是1

在左侧第一列,需要处理一种特别有意思的情况,即物品的重量为0(nums[i]=0),该物品能够满足背包容量为0的情况。前面有record个num[i] = 0的情况,那么总的方法会变成2的record次方,注意这个方法是会累计的 ,遇到num[i]=0就累积,如果遇到num[i]!=0,就不累计了,但是可别错误得改成1.   

遍历顺序:第一列已经初始化过了,但从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+target)%2!=0 || abs(target)>sum){     //细节return 0;                     //你看嗷,如果x不是整数,不就说明没办法构造吗}int x = (target+sum)/2;vector<vector<int>> dp(nums.size(),vector<int>(x+1,0));// 第一行if(nums[0]<=x){dp[0][nums[0]] = 1;}// 第一列  int record = 0;for(int i=0;i<nums.size();i++){if(nums[i]==0){record++;//cout<<record<<endl;}//dp[i][0] = 2^record;    //每一个值为0的数字都有选与不选两种状态dp[i][0] = (int) pow(2.0,record);}for(int i=1;i<nums.size();i++){for(int j=1;j<=x;j++){if(nums[i]>j) dp[i][j] = dp[i-1][j];else{dp[i][j] = dp[i-1][j] +dp[i-1][j-nums[i]];  //不放物品i的方法+放物品i的方法(空出i的值)//cout<<dp[i][j]<<endl;}}     }return dp[nums.size()-1][x];}
};

debug了好久

压缩成一维,初始化dp[0]为1就可以了,如果第一个物品重量为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+target)%2!=0 || abs(target)>sum){     //细节,没有abs,在测试用例为nums=100,target=-200时报错return 0;                     //你看嗷,如果x不是整数,不就说明没办法构造吗}int x = (target+sum)/2;vector<int> dp(x+1,0);dp[0] = 1;         //放第一个物品时,先把不放物品的这一种情况加上,后面递推可以根据nums[0]的值来调整for(int i=0;i<nums.size();i++){for(int j=x;j>=nums[i];j--){dp[j] = dp[j] +dp[j-nums[i]];  //不放物品i的方法+放物品i的方法(空出i的值)//cout<<dp[i][j]<<endl;}     }return dp[x];}
};

474.一和零

力扣题目链接

定义:dp[i][j]为最多i个0,j个1的子集大小

递推公式:将每一个strs中的一个字符串看作是一个物品,物品重量分别为0的个数和1的个数,价值为1(代表是子集的一个组成部分)

初始化:由于value都是1,初始化一个小一点的数,0就可以了

遍历顺序:按一维dp来

打印:略

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 zeroNum = 0;int oneNum = 0;for(char s:str){if (s=='0') zeroNum++;else{oneNum++;}             //Calculate the weight of every str}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);     //value[str] = 1;这句是放与不放str的值的对比}}}return dp[m][n]; }
};

 


http://www.ppmy.cn/devtools/164878.html

相关文章

STM32---FreeRTOS中断管理试验

一、实验 实验目的&#xff1a;学会使用FreeRTOS的中断管理 创建两个定时器&#xff0c;一个优先级为4&#xff0c;另一个优先级为6&#xff1b;注意&#xff1a;系统所管理的优先级范围 &#xff1a;5~15 现象&#xff1a;两个定时器每1s&#xff0c;打印一段字符串&#x…

大语言模型揭秘:从诞生到智能

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;无疑是技术领域最耀眼的明星之一。它们不仅能够理解人类的自然语言&#xff0c;还能生成流畅的文本&#xff0c;甚至在对话、翻译、创作等任务中表现出接近人类的智能…

基于Python Django的人脸识别上课考勤系统(附源码,部署)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

run方法执行过程分析

文章目录 run方法核心流程SpringApplicationRunListener监听器监听器的配置与加载SpringApplicationRunListener源码解析实现类EventPublishingRunListener 初始化ApplicationArguments初始化ConfigurableEnvironment获取或创建环境配置环境 打印BannerSpring应用上下文的创建S…

SpaCy处理NLP的详细工作原理及工作原理框图

spaCy处理NLP的详细工作原理及工作原理框图 spaCy处理NLP的详细工作原理 spaCy是一个基于Python的开源自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了一系列高效且易用的工具&#xff0c;用于执行各种NLP任务&#xff0c;如文本预处理、文本解析、命名实体识…

5G网络切片技术浅显易懂分析

5G网络是要面向多连接和多样化业务的&#xff0c;需要能够像积木一样灵活部署&#xff0c;方便地进行新业务快速上线/下线&#xff0c;满足人们日益增长的数据业务需求。即&#xff1a;要有分类管理&#xff0c;要能灵活部署&#xff0c;于是网络切片这一概念应运而生。 网络切…

【Go语言快速上手】第一部分:数据类型(数组、切片、映射)与控制语句

文章目录 一、复合类型Ⅰ 数组1. 语法2. 示例3. 特点4. 数组的传递 Ⅱ 切片1. 定义2. 语法3. 示例4. 特点5. 切片的创建6. 切片的操作切片的扩展切片的拷贝 Ⅲ 映射1. 定义2. 语法3. 示例4. 特点5. 映射的创建6. 映射的操作示例&#xff1a;插入、访问和删除判断键是否存在示例…

angular实现nodejs增删改查

说明&#xff1a; 我计划用nodejs来实现操作mysql中的表&#xff0c;增删改查的功能&#xff0c; 包括&#xff1a; 1.连接mysql数据库&#xff0c; 2.创建数据表&#xff0c; 3.写增删改查的方法&#xff0c; 4.postman里面去请求访问数据&#xff0c; 5.在angular里面&#x…