【代码随想录】面试常考类型之动态规划01背包

前言

更详细的在大佬的代码随想录 (programmercarl.com)

本系列仅是简洁版笔记,为了之后方便观看

不同的二叉搜索树

96. 不同的二叉搜索树 - 力扣(LeetCode)

通过举例子发现重叠子问题

代码很简单,主要是思路问题,知道二叉搜索树的概念,并分别对左右子树进行计算,相乘 

class Solution {
public:
    int numTrees(int n) {
           vector<int>dp(n+1);
           dp[0]=1;
          for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++){
                dp[i]+=dp[j-1]*dp[i-j];
            }
          }
           return dp[n];
    }
};

01背包

二维01背包

dp[i][j]表示 [0-i]的物品里任意取容量为j的背包的价值

  • 不放物品i:dp[i][j]=dp[i - 1][j]
  • 放物品i:dp[i][j]=dp[i - 1][j - weight[i]] + value[i] 
  • 注意:非零下标不管初始化什么值,都不影响最后结果,但是有零下表初始化需要在注意
  • dp[0][j],当 j < weight[0]的时候,放不进去,dp[0][j] = 0;当j >= weight[0]时,dp[0][j] =value[0]

  • vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));
    for (int j = weight[0]; j <= bagweight; j++) {
            dp[0][j] = value[0];
        }
  • 二维数组实现的dp01背包for循环可以颠倒

  • for(int i = 1; i < weight.size(); i++) { // 物品
         for(int j = 0; j <= bagweight; j++) { // 背包
           if (j < weight[i]) dp[i][j] = dp[i - 1][j];
             else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
            }
        }

一维01背包 

dp[j]容量为j的背包的价值

  • 不放物品i:dp[j]=dp[j]
  • 放物品i:dp[j]=dp[j - weight[i]] + value[i] 
  • 注意:非零下标不管初始化什么值,都不影响最后结果,但是有零下标初始化为非负数的最小值0就可以
  • vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));
    for (int j = weight[0]; j <= bagweight; j++) {
            dp[0][j] = value[0];
        }
  • 一维数组实现的dp01背包for循环不可以颠倒,背包必须倒序输出,这样才能符合每个背包只能使用一次

  •   vector<int> dp(N + 1, 0);
        for (int i = 0; i < 物品数量; ++i) {
            for (int j = N; j >= costs[i]; --j) {
                  dp[j] = max(dp[j], dp[j - costs[i]] + values[i]);
            }
        }

分割等和子集 

416. 分割等和子集 - 力扣(LeetCode)

把数组分割成两个元素和相等的子集,可以弄成01背包问题,每个数只能使用一次,观察是否能把num/2的背包容量给填满

注意:本题重量和价值是统一变量

dp[j] == j 时集合中的子集总和正好可以凑成总和j

class Solution {
public:
    bool canPartition(vector<int>& nums) {
         int sum=0;
         vector<int>dp(10001,0);
         for(int i=0;i<nums.size();i++){
            sum+=nums[i];
         }
         if(sum%2==1) return false;//说明凑不成两个一样的数
         int target=sum/2;
         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;
        return false;    
    }
};

最后一块石头的重量II

1049. 最后一块石头的重量 II - 力扣(LeetCode)

两两石头相撞,最终取得最小差值,可以分成两个数量之和相近的堆,来进行计算是上一题的演变,重量和价值是统一变量

target = sum / 2向下取整,所以sum - dp[target] >=dp[target],,所以最终结果就是用大的减去小的

class Solution {
public:
    int lastStoneWeightII(vector<int>& nums) {
         int sum=0;
         vector<int>dp(15001,0);
         for(int i=0;i<nums.size();i++){
            sum+=nums[i];
         }
         int target=sum/2;
         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]);
            } 
         }
          return sum - dp[target] - dp[target];    
    }
};

目标和 

 494. 目标和 - 力扣(LeetCode)

一个集合分出两个子集,加法left集合和减法right集合 

left- right = target。

left + right = sum

right = sum - left

left - (sum - left) = target

left = (target + sum)/2

targe,sum是固定的,所以就可以转化为在集合nums中找出和为left的组合

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

一和零

474. 一和零 - 力扣(LeetCode)

dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]

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);
     }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AD使用问题

设计流程&#xff1a; 1.先创建项目——添加原理图&#xff0c;原理图库&#xff0c;PCB&#xff0c;PCB库 2.画原理图库和封装库 主要有三种方法&#xff1a; &#xff08;1&#xff09;手动画库和封装&#xff0c;常常用于嘉立创查询不到的器件 &#xff08;2&#xff0…

spark的简单学习二

一 spark sql基础 1.1 Dataframe 1.介绍&#xff1a; DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表 格&#xff0c;除了数据以外&#xff0c;还掌握数据的结构信息&#xff0c;即schema。同时&#xff0c;与Hive类似&#xff0c;DataFrame也支 持…

6、xss-labs之level8

1、测试分析 传入123查看页面源码&#xff0c;发现传入的值传给了value和a标签的href&#xff0c;并且对特殊字符<>" 都进行了HTML实体化&#xff0c;对于大小写进行了转化&#xff0c;过滤掉了src、data、onfocus、href、script、"&#xff08;双引号&#…

边缘计算网关的主要功能有哪些?天拓四方

随着物联网&#xff08;IoT&#xff09;的快速发展和普及&#xff0c;边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备&#xff0c;边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

Discourse 编辑没有办法显示更多的 JS 错误

Priority/Severity: High Platform: 3.3.0.beta3-dev UI bugs Description: 昨天升级的时到最新版本的时候就发现有这个错误&#xff0c;是 JS 的错误。 发了一个帖子到官方的网站上&#xff0c;官方说可能是插件的问题。 但是我们实在是没有安装什么插件呀&#xff1f; 官方…

Beego 使用教程 8:Session 和 Cookie

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发&#xff0c;包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado&#xff0c; Sinatra 和 Flask beego 官网&#xff1a;http://beego.gocn.vip/ 上面的 be…

地下18米的科技守护:旗晟综合管廊巡检机器人

近日&#xff0c;安徽某业主的地下18米深的地下管廊处&#xff0c;一种先进的巡检机器人正活跃在管廊轨道上&#xff0c;执行着重要的巡检任务&#xff0c;只见机器人在管廊轨道上平稳前行&#xff0c;它搭载着先进的检测设备&#xff0c;对地下管廊内的各种设施进行监测巡检&a…

养猫久了才知道,为什么宠物空气净化器是养猫必备!效果惊人!

养猫是一件非常愉快的事情&#xff0c;猫咪的陪伴能带给我们无尽的欢乐和温暖。然而&#xff0c;随着时间的推移&#xff0c;许多养猫的朋友会发现一个问题&#xff0c;那就是家中的空气质量变差了&#xff0c;猫毛、异味等问题也随之而来。这时候&#xff0c;一款好的宠物空气…

【Python】 Python中的“命名元组”:简单而强大的数据结构

基本原理 在Python中&#xff0c;namedtuple是tuple的一个子类&#xff0c;它允许我们为元组的每个位置指定一个名字。这种数据结构非常适合用于需要固定字段和值的场景&#xff0c;例如数据库查询的结果或配置文件中的设置。 namedtuple提供了一种方便的方式来访问元组中的元…

mysql中单表查询的成本

大家好。我们知道MySQL在执行一个查询时&#xff0c;经常会有多个执行方案&#xff0c;然后从中选取成本最低或者说代价最低的方案去真正的执行查询。今天我们来聊一聊单表查询的成本。 那么到底什么是成本呢&#xff1f;这里我们说的成本或者代价是由两方面组成的&#xff1a…

Android性能优化方案

1.启动优化&#xff1a; application中不要做大量耗时操作,如果必须的话&#xff0c;建议异步做耗时操作2.布局优化&#xff1a;使用合理的控件选择&#xff0c;少嵌套。&#xff08;合理使用include,merge,viewStub等使用&#xff09;3.apk优化&#xff08;资源文件优化&#…

opencv c++编程基础

1、图片的本质 图像在 OpenCV 中的本质 在 OpenCV 中&#xff0c;图像被表示为一个多维数组&#xff0c;其中每个元素对应于图像中的单个像素。图像的维度取决于其通道数和像素数。 **通道数&#xff1a;**图像可以有多个通道&#xff0c;每个通道存储图像的不同信息。例如&…

大学生选择算法向还是嵌入式向?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 由于嵌入式的薪资待遇和…

【oracle】Oracle RAC中的GNS到底是什么?

本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载 一、概述 Oracle Grid Naming Service (GNS) 是Oracle Grid Infrastructure的一个重要组件&#xff0c;它提供了一种集中式的命名服务&…

33 mid 55. 跳跃游戏

贪心算法&#xff1a; class Solution {public boolean canJump(int[] nums) {int leftBorder 0;for (int i 0; i <nums.length; i) {if(i<leftBorder){leftBorderMath.max(leftBorder,inums[i]);}if(leftBorder>nums.length-1){return true;}}return false;} }

元宇宙vr科普馆场景制作引领行业潮流

在这个数字化高速发展的时代&#xff0c;北京3D元宇宙场景在线制作以其独特的优势&#xff0c;成为了行业内的创新引领者。它能够快速完成空间设计&#xff0c;根据您的个性化需求&#xff0c;轻松设置布局、灯光、音效以及互动元素等&#xff0c;为您打造出一个更加真实、丰富…

TCP—三次握手和四次挥手

目录 一、三次握手和四次挥手的目的 二、TCP可靠的方面 三、什么是三次握手 四、第三次握手的目的 五、什么是四次挥手 六、超时时间的目的 七、SYN包、ACK包、FIN包 八、解决丢包和乱序 九、参考资料 一、三次握手和四次挥手的目的 TCP三次握手的目的主要是为了确保两…

谷歌地图 | Google I/O ‘24 重磅发布助力企业拓展海外市场的新功能!

编者按&#xff1a;本文是 Google I/O 2024 系列的一部分&#xff0c;该系列分享了Google 年度开发者大会上最新的 Google Maps Platform 新闻。 距全球首个 Google Maps API 问世已近 20 年。它引领了网络和移动端地理空间体验的革命。从那时起&#xff0c;Google Maps Platf…

Common Lisp笔记

在计划学习函数式编程的时候&#xff0c;我一开始打算学习的是 F#。因为我朋友就是在 DTU 上的学&#xff0c;F# 就是 DTU&#xff08;丹麦理工&#xff09;开发的。但是由于 F# 和微软的 .NET 绑定&#xff0c;而在 macOS 上&#xff0c;目前版本的 .NET 的是有些问题的&#…

2023年平均工资公布!你是什么段位?

来源国家统计局&#xff08;下同&#xff09; 01 城镇非私营单位就业人员年平均工资情况 2023年&#xff0c;全国城镇非私营单位就业人员年平均工资为120698元&#xff0c;比上年增加6669元&#xff0c;名义增长5.8%&#xff0c;扣除价格因素实际增长5.5%。 2014-2023年城镇非私…