当前位置: 首页 > news >正文

【LeetCode】背包问题总结

文章目录

  • 一、背包能否装满?
    • 416. 分割等和子集
    • 1049. 最后一块石头的重量 II
  • 二、装满背包有几种方法?
    • 494. 目标和
    • 518.零钱兑换II
    • 377. 组合总和 Ⅳ
    • 70. 爬楼梯
  • 三、背包装满的最大价值
    • 474.一和零
  • 四、装满背包最小物品数
    • 322. 零钱兑换
    • 279.完全平方数

一、背包能否装满?

416. 分割等和子集

在这里插入图片描述

class Solution {
public:// 01背包:逆序遍历// 组合问题:先背包后容量bool canPartition(vector<int>& nums) {int m = nums.size();int sum = accumulate(nums.begin(), nums.end(), 0);if(sum & 1) return false;int n = sum / 2;vector<int> dp(n + 1, 0);        // dp[j]:容量为j的背包,最多装入重量为dp[j]的物品for(int i = 0; i < m; i++){for(int j = n; j >= nums[i]; j--){dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);}}return dp[n] == n;}
};

dp背包问题——416. 分割等和子集

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

在这里插入图片描述

class Solution {
public:// 01背包:逆序遍历// 组合问题:先物品、后容量int lastStoneWeightII(vector<int>& stones) {int m = stones.size();int sum = accumulate(stones.begin(), stones.end(), 0);int n = sum / 2;vector<int> dp(n + 1, 0);  // dp[j]:容量为j的背包,最多装dp[j]的石头for(int i = 0; i < m; i++){for(int j = n; j >= stones[i]; j--){dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);}}return sum - 2 * dp[n];}
};

dp背包问题——1049. 最后一块石头的重量 II

二、装满背包有几种方法?

494. 目标和

在这里插入图片描述

class Solution {
public:// 01背包:逆序遍历// 组合问题:先物品,后容量int findTargetSumWays(vector<int>& nums, int target) {int sum = accumulate(nums.begin(), nums.end(), 0);if((sum + target) & 1) return 0;int m = nums.size();int n = (sum + target) / 2;if(n < 0) return 0;vector<int> dp(n + 1, 0);  // dp[j]:装满容量为j的背包,有dp[j]种方法dp[0] = 1;                 // 装满容量为0的背包,只有1种方法for(int i = 0; i < m; i++){for(int j = n; j >= nums[i]; j--){// 多了一个物品可选择后,装满背包的方法数就是 :(没有当前物品可选时的方法数 + 选了当前物品的方法数)dp[j] = dp[j] + dp[j - nums[i]];}}return dp[n];}
};

dp背包解决组合问题——494. 目标和

518.零钱兑换II

在这里插入图片描述

class Solution {
public:// 完全背包:顺序遍历// 组合问题:先物品、后容量int change(int amount, vector<int>& coins) {int m = coins.size();int n = amount;vector<int> dp(n + 1, 0);  // dp[j]:装满容量为j的背包,有dp[j]种方式dp[0] = 1;for(int i = 0; i < m; i++){for(int j = coins[i]; j <= n; j++){// 多了一个物品可选后,装满背包的方法数就是 :(没有当前物品可选时的方法数 + 选了当前物品的方法数)dp[j] = dp[j] + dp[j - coins[i]];}}return dp[n];}
};

dp完全背包问题解组合问题——零钱兑换

377. 组合总和 Ⅳ

在这里插入图片描述

class Solution {
public:// 完全背包:顺序遍历// 排列问题:先容量,后物品int combinationSum4(vector<int>& nums, int target) {int m = nums.size();int n = target;vector<int> dp(n + 1, 0); // dp[j]:装满容量为j的背包,物品的组合数为dp[j]dp[0] = 1;for(int j = 1; j <= n; j++){for(int i = 0; i < m; i++){if(j >= nums[i] && dp[j] < INT_MAX - dp[j - nums[i]]) dp[j] += dp[j - nums[i]];}}return dp[n];}
};

70. 爬楼梯

在这里插入图片描述

class Solution {
public:// 完全背包:顺序遍历// 排列问题:先容量,后物品int climbStairs(int n) {int m = 2;int nums[2] = {1,2};vector<int> dp(n + 1, 0);  // dp[j]:装满容量为j的背包,有dp[j]种方法dp[0] = 1;for(int j = 1; j <= n; j++){for(int i = 0; i < m; i++){if(j >= nums[i]) dp[j] = dp[j] + dp[j - nums[i]];}}return dp[n];}
};

排列问题:先容量,后物品

如果物品为{1,2},假如此时容量为2(容量为1的背包只能装物品1),用当前容量遍历多个物品,可以选择在装了物品1的基础上接着装,也可以选择不在其基础上装,直接装入物品2。当容量为3时,也可以选择在装有物品2的基础上再装入物品1,这样就出现了{2,1}

组合问题:先物品,后容量

如果物品为{1,2,3},假如此时容量为5

在这里插入图片描述
只有物品1,用各个容量遍历,此时无论是什么容量的背包,都只能放入物品1
此时我们手拿着物品2,对于每一个容量,要么直接使用现在就装满的背包,要么找一个剩余容量为2的背包放入当前物品2
接着我们手拿着物品3,对于每一个容量,要么直接使用现在就装满的背包,要么找一个剩余容量为3的背包放入当前物品3

class Solution {
public:int climbStairs(int n) {vector<int> dp(n + 1, 0);dp[0] = 1;dp[1] = 1;for(int i = 2; i <= n; i++){dp[i] = dp[i - 2] + dp[i - 1];  // 要么爬1个台阶,要么2个台阶}return dp[n];}
};

三、背包装满的最大价值

474.一和零

在这里插入图片描述

class Solution {
public:// 01背包:逆序遍历// 组合问题:先物品、后容量int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));  // dp[i][j]:装满容量为ij背包的最大价值for(string& s : strs){int w0 = 0;int w1 = 0;for(char c : s){if(c == '0') w0++;else w1++;}// 每次循环计算出的dp[m][n]表示只有前几个物品可选时,所获得的最大价值for(int i = m; i >= w0; i--){for(int j = n; j >= w1; j--){dp[i][j] = max(dp[i][j], dp[i - w0][j - w1] + 1);  // 1表示价值}}}return dp[m][n];}
};

四、装满背包最小物品数

322. 零钱兑换

在这里插入图片描述

class Solution {
public:// 问装满背包需要最少的物品数int coinChange(vector<int>& coins, int amount) {// 完全背包:顺序遍历// 组合问题:先物品、后容量,装满就行,不在意装入的顺序int m = coins.size();int n = amount;// 凑成面值n,最多需要n个硬币,初始化为n + 1即可vector<int> dp(n + 1, n + 1); // dp[j]:装满容量为j的背包至少需要dp[j]个物品dp[0] = 0;for(int i = 0; i < m; i++){for(int j = coins[i]; j <= n; j++){// 装满容量为j的背包,要么直接用前面的物品装满,要么找一个剩余容量为coins[i]的背包放入coins[i]dp[j] = min(dp[j], dp[j - coins[i]] + 1);  }}return dp[n] == n + 1 ? -1 : dp[n];}
};

279.完全平方数

在这里插入图片描述

class Solution {
public:// 物品为:[1,4,9,...]// 容量为n,问装满背包至少需要几个物品int numSquares(int n) {// 完全背包:顺序遍历// 组合问题:先物品、后容量vector<int> dp(n + 1, n);dp[0] = 0;for(int i = 1; i <= n / i; i++){for(int j = i * i; j <= n; j++){dp[j] = min(dp[j], dp[j - i * i] + 1);}}return dp[n];}
};

相关文章:

【LeetCode】背包问题总结

文章目录一、背包能否装满&#xff1f;416. 分割等和子集1049. 最后一块石头的重量 II二、装满背包有几种方法&#xff1f;494. 目标和518.零钱兑换II377. 组合总和 Ⅳ70. 爬楼梯三、背包装满的最大价值474.一和零四、装满背包最小物品数322. 零钱兑换279.完全平方数一、背包能…...

Java的开发工具有哪些?这十款工具大厂都在用!

工欲善其事必先利其器&#xff0c;各位同学大家好&#xff0c;我是小源~本期文章&#xff0c;给大家推荐十款Java的开发工具。一、 文本编辑器主要推荐三款&#xff1a;notepad、editplus、sublime text。这三款编辑工具&#xff0c;在我们的开发工作中几乎是相差无几&#xff…...

web学习-Node.js入门学习

web学习-Node.js入门学习1.回顾与思考2. 初识Node.js2.1 Node.js的简介2.2Node.js的环境安装2.3. fs文件系统模块2.3.1 fs.readFile()2.3.2 fs.writeFile()2.3.3 练习-整理考试成绩2.3.4 fs模块-路径动态拼接的问题2.4 path路径模块2.5 http模块2.5.1 服务器相关的概念2.5.2 创…...

100 eeeee

全部 答对 答错 敏捷综合训练3 1.看板中的精益生产概念是如何减少工作在瓶颈时期的影响&#xff1f; A它不会减少瓶颈&#xff0c;因为瓶颈是任何生产系统不可避免的副产品 B通过运用 5Y 分析根本原因 C通过成为一个及时的进度系统 D通过每周完善活动 答错了 收藏 学员得…...

物盾安全汤晓冬:工业互联网企业如何应对高发的供应链安全风险?

编者按&#xff1a;物盾安全是一家专注于物联网安全的产品厂商&#xff0c;其核心产品“物安盾”在能源、制造、交通等多个领域落地&#xff0c;为这些行业企业提供覆盖物联网云、管、边、端的安全整体解决方案。“物安盾”集成了腾讯安全制品扫描&#xff08;BSCA&#xff09;…...

微纳制造技术——基础知识

1.什么是直接带隙半导体和间接带隙半导体 导带底和价带顶处以同一K值&#xff0c;称为直接带隙半导体 导带底和价带顶不处在同一K值&#xff0c;称为间接带隙半导体 2.扩散和漂移的公式 3.三五族半导体的性质 1.high mobility 2.wide bandgap 3.direct bandgap 4.三五族…...

Makefile的使用

Makefile的使用 自动化编译脚本&#xff0c;这个东西就是&#xff0c;进行简单的设置&#xff0c;然后实现原码编成为相应程序&#xff0c;简单化自己进行相关操作的过程。不需要一个个自己进行全部进行输入。而且还有许多的简化书写方法。 ​ 这个Makefile的本质为一种脚本语言…...

RealBasicVSR模型转成ONNX以及用c++推理

文章目录安装RealBasicVSR的环境1. 新建一个conda环境2. 安装pytorch(官网上选择合适的版本)版本太低会有问题3. 安装 mim 和 mmcv-full4. 安装 mmedit下载RealBasicVSR源码下载模型文件写一个模型转换的脚步测试生成的模型安装RealBasicVSR的环境 1. 新建一个conda环境 cond…...

C语言作用域(变量生存的空间)学习

C 作用域规则 任何一种编程中&#xff0c;作用域是程序中定义的变量所存在的区域&#xff0c;超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量&#xff1a; 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数参数定义中 让我们来看看什么是局…...

Spark性能优化一 概念篇

&#xff08;一&#xff09;宽依赖和窄依赖 窄依赖(Narrow Dependency)&#xff1a;指父RDD的每个分区只被子RDD的一个分区所使用&#xff0c;例如map、filter等 这些算子一个RDD&#xff0c;对它的父RDD只有简单的一对一的关系&#xff0c;也就是说&#xff0c;RDD的每个part…...

[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 二分查找实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SearchFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要…...

3.基于Label studio的训练数据标注指南:文本分类任务

文本分类任务Label Studio使用指南 1.基于Label studio的训练数据标注指南&#xff1a;信息抽取&#xff08;实体关系抽取&#xff09;、文本分类等 2.基于Label studio的训练数据标注指南&#xff1a;&#xff08;智能文档&#xff09;文档抽取任务、PDF、表格、图片抽取标注等…...

Python进阶-----面向对象3.0(面对对象三大特征之---封装)

目录 前言&#xff1a; 什么是封装 Python私有化封装 习题 前言&#xff1a; 上一期是讲解Python中类的私有属性和方法&#xff0c;其实很好理解&#xff0c;我给一个类中的部分属性进行加密拒绝访问&#xff08;上一期链接Python进阶-----面向对象2.0&#…...

软考中级软件设计师备考建议

前言 首先我说一下个人对这个考试的一个感受看法&#xff0c;我觉得软件设计师考试并不难&#xff0c;主要是不要被内心的恐惧吓倒&#xff0c;考试中心态真的很重要&#xff01; 一、中级软件设计师科目包括&#xff1a; &#xff08;1&#xff09;计算机与软件工程知识&am…...

【机器学习】决策树(理论)

决策树&#xff08;理论&#xff09; 目录一、何为决策树1、决策树的组成2、决策树的构建二、熵1、熵的作用2、熵的定义3、熵的计算4、条件熵的引入5、条件熵的计算三、划分选择1、信息增益&#xff08; ID3 算法选用的评估标准&#xff09;2、信息增益率&#xff08; C4.5 算法…...

VSCode下载与安装使用教程【超详细讲解】

目录 一、VSCode介绍 二、官方下载地址 三、VSCode安装 1、点击我同意此协议&#xff0c;点击下一步&#xff1b; 2、点击浏览&#xff0c;选择安装路径&#xff0c;点击下一步&#xff1b; 3、添加到开始菜单&#xff0c;点击下一步&#xff1b; 4、根据需要勾选&#…...

2023年3月北京/上海/广州/深圳DAMA数据管理认证CDGA/CDGP

弘博创新是DAMA中国授权的数据治理人才培养基地&#xff0c;贴合市场需求定制教学体系&#xff0c;采用行业资深名师授课&#xff0c;理论与实践案例相结合&#xff0c;快速全面提升个人/企业数据治理专业知识与实践经验&#xff0c;通过考试还能获得数据专业领域证书。 DAMA认…...

进程和线程理论知识

1.进程和线程之间的联系。 进程是程序依次执行的过程&#xff0c;线程是比进程小的执行单位。 一个进程在其执行过程中可以创建多个线程。 多个线程共享进程的堆和方法区内存资源。 进程是OS进行资源分配的基本单位。 线程是OS进行调度的基本单位。 进程和线程是1&#xff1…...

华为OD机试用Python实现 -【广播服务器】

华为OD机试题 最近更新的博客华为 OD 机试 300 题大纲广播服务器题目输入输出示例一输入输出示例二输入输出Python代码代码编写思路最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题...

Solon2 的应用生命周期

Solon 框架的应用生命周期包括&#xff1a;一个初始化函数时机点 六个事件时机点 两个插件生命时机点 两个容器生命时机点&#xff08;v2.2.0 版本的状态&#xff09;&#xff1a; 提醒&#xff1a; 启动过程完成后&#xff0c;项目才能正常运行&#xff08;启动过程中&…...

学习笔记-架构的演进之服务容错策略设计模式-3月day02

文章目录前言断路器模式舱壁隔离模式重试模式总结附前言 容错设计模式&#xff0c;指的是“要实现某种容错策略&#xff0c;我们该如何去做”。微服务中常见的设计模式包括断路器模式、舱壁隔离模式和超时重试模式等&#xff0c;另外还有流量控制模式等。 断路器模式 断路器…...

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(上)

前言 HTML 是一切Web开发的基础&#xff0c;本文专门为小白整理&#xff0c;针对前端零基础的朋友们&#xff0c;手把手教你学习HTML&#xff0c;让你轻松迈入WEB开发的行列。 首先&#xff0c;感谢 橙子_ 在HTML学习以及本文编写过程中对我的帮助。 文章目录前言一.HTML简介1.…...

mes系统核心业务流程及应用场景介绍

现在许多企业已经开始使用MES系统控制和管理工厂的生产过程&#xff0c;实时监控、诊断和控制生产过程&#xff0c;完成单元集成和系统优化。本文将为大家具体介绍一下MES系统的业务流程。 MES系统业务流程 1、计划调度MES系统承接了ERP订单&#xff0c;开始干预生产。该模块…...

应用统计部分常用公式总结

常见分布函数 常用公式 分位数&#xff1a;P{X>xα}α,P{X≤xα}1−αP\{X>x_\alpha\}\alpha, P\{X\le x_\alpha\}1-\alphaP{X>xα​}α,P{X≤xα​}1−αE(Xi)E(X)E(X‾)μE(X_i)E(X)E(\overline X)\muE(Xi​)E(X)E(X)μE(X2)E2(X)D(X)μ2σ2E(X^2)E^2(X)D(X)\mu^2…...

阿赵的MaxScript学习笔记分享八《文件操作》

大家好&#xff0c;我是阿赵。继续分享MaxScript学习笔记第八篇 。这一篇主要讲文件操作&#xff0c;包括文件的I/O和导入导出。 1、获得3DsMax指定的一些目录路径 如果在电脑上安装了3DsMax软件&#xff0c;那么在文档里面会有一个3dsMax的文件夹&#xff0c;里面有一些3dsMa…...

将项目封装进docker进行迁移或使用

首先要理解docker的基本使用&#xff0c;本文不做过多阐述&#xff0c;博主也对docker没有了解透彻。 这里列一下docker的基本命令&#xff1a; docker info # 查看docker信息 docker -v # 查看docker版本 docker images # 查看docker所有的镜…...

matlab - 特殊矩阵、矩阵求值、稀疏矩阵

学习视频1.特殊矩阵1.1 通用特殊矩阵format % 零矩阵(全0) 幺矩阵(全1) 单位矩阵 % zeros ones eye rand(生成0~1的随机元素) randn(生成均值为1&#xff0c;方差为0的符合正太分布的随机阵)zeros(3) % 3x3的全0方阵 zeros(3, 4) % 3x4的全0矩阵 exA ones(3, 5) % 3x5的…...

Flume使用入门

目录 一. Flume简单介绍 1. Agent 2. Source 3. Sink 4. Channel 5. Event 二. 环境安装 1. 创建日志目录 2. 修改日志配置文件 3.修改运行堆内存 4. 确定日志打印的位置 5. 修改flume使用内存 内存调大 三. 校验flume 1. 安装netcat工具和net-tools工具 2. 判…...

【Servlet篇2】Servlet的工作过程,Servlet的api——HttpServletRequest

一、Servlet的工作过程 二、Tomcat的初始化 步骤1&#xff1a;寻找到当前目录下面所有需要加载的Servlet(也就是类) 步骤2&#xff1a;根据类加载的结果创建实例(通过反射)&#xff0c;并且放入集合当中 步骤3&#xff1a;实例创建好之后&#xff0c;调用Servlet的init()方…...

【JAVASE】注解

文章目录1.概述2.JDK内置注解2.1override注解2.2 Deprecated注解3.元注解4.注解中定义属性4.1 属性value4.2 属性是一个数组5. 反射注解6.注解在开发中的作用1.概述 注解&#xff0c;也叫注释&#xff0c;是一种引用数据类型。编译后也同样生成class字节码文件。 语法 [修饰…...

制作视频软件哪个免费/seo顾问是什么

DispatchAction的作用简单地说就是把原来我们写在多个acton里的操作放在同一个 action里处理。 在Struts-config 中 相关的配置内容<action-mappings> <action path"/welcome" forward"/index.jsp"/> <!-- DispatchAction Example --> …...

推广产品网站建设/sem技术培训

这些面试题你都会了吗&#xff1f;&#xff08;精选97道Java核心面试题&#xff09; 常量池有哪些&#xff0c;数据结构&#xff0c;自己设计一个常量池String为啥设计为final&#xff0c;好处是啥&#xff0c;其中的equals方法如何实现的jdk序列化怎么实现&#xff0c;有测试…...

产品介绍网站设计怎么做/安卓优化大师老版本下载

转载请标明地址 QuincySx&#xff1a; http://www.jianshu.com/p/a6554196fd78 开始中可能遇到比较恶心的Activity跳转 比如在库中Activity中向另一个库中跳转 接下来说一种优雅的方式 在目的Activity的AndroidManifest文件中Activity声明处加上如下语句 <intent-filter>…...

兰陵建设局网站/seo技术培训教程

这是oracle官网所给的jdk7版本下,jdk jre jvm之间的关系 https://docs.oracle.com/javase/7/docs/ 看完上图之后 查看整体结构 最外层为jdk(java开发工具集 Java Development Kit) jdk内部包含了jre(java运行时环境 Java Runtime Environment) 而jre内部包含了jvm(java虚…...

个人网站的设计与开发/营销渠道有哪些

发那科机器人应用项目大揭秘FANUC iR PickTool是对传送带上的工件使用相机或光电传感器等设备进行检测&#xff0c;机器人配合传送带的运动对工件进行动态拾取的定制化软件。该软件提供了多台机器人共享一条传送带上工件数据信息的应用&#xff0c;支持一台机器人同时对应多条传…...

湖北聚四方建设有限公司网站/南通企业网站制作

一、数组是什么&#xff1f; 数组就是用来存储 一批同类型数据 的 内存区域(可以理解成容器)。 例子&#xff1a; // 1.将整数&#xff1a;10&#xff0c;90&#xff0c;100&#xff0c;80&#xff0c;40 定义一个数组存起来 // 定义一个int类型的数组 arr int[] arr {10, 90…...