0-1背包问题

(1)第一种情况:二维dp[i][j]数组

dp[i][j]表示[0,i]的物品放入容量为j背包的最大价值

不放物品i,dp[i][j]=dp[i-1][j]

放物品i,dp[i][j]=dp[i-1][j-w[i]]+v[i]

递推公式为:

 dp[i][j]=dp[i-1][j];//不放

 if(w[i]<=j)dp[i][j]=max(dp[i][j],dp[i-1][j-w[i]]+v[i]);

  //当前物品体积小于j才可以放

两层for循环,先遍历物品或者先变量背包容量都可以

(2)第二种情况:一维dp[j]数组...相当于上一层数组拷贝下来,也叫滚动数组

dp[j]表示容量为j的背包所能放的最大价值

不放物品i,dp[j]=dp[j]

放物品i,dp[j]=dp[j-w[i]]+v[i]

递推公式为:

dp[j]=max(dp[j],dp[j-w[i]]+v[i])

双重for循环,必须先遍历物品,再遍历背包,同时背包要倒序遍历。

for(int i=0;i<n;i++){

        for(int j=t;j>=nums[i];j--){

            dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);

        }

    }

原因:保证每个物品只添加一次

416 分割等和子集

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

1 <= nums.length <= 200

1 <= nums[i] <= 100

示例 1:

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

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。
  • 背包的体积为sum / 2
  • 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  • 背包如何正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。

0-1背包问题,相当于物品体积和价值都是nums[i]

对数组求和,sum为奇数一定不满足

求出容量为sum/2时能放入的最大价值,如果刚好放慢,则说明可以分割为等和子集。

根据数组长度和大小,可以确定dp数组的大小,100*200/2=10000

int max(int a,int b){return a>b?a:b;
}
/*0-1背包问题,相当于物品体积和价值都是nums[i]
对数组求和,sum为奇数一定不满足
求出容量为sum/2时能放入的最大价值,如果刚好放慢,则说明可以分割为等和子集
*/
bool canPartition(int* nums, int numsSize) {int sum=0,i,j;int dp[10005]={};//dp[j]表示背包体积为j能放入的最大体积for(i=0;i<numsSize;i++){sum+=nums[i];}if(sum%2!=0)return false;//数组和必为偶数else{for(i=0;i<numsSize;i++){//必须先遍历物品for(j=sum/2;j>=nums[i];j--){//倒序遍历,保证每个元素只添加一次dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);//放入物品i,dp[j-nums[i]]+nums[i}}}if(dp[sum/2]==sum/2)return true;else return false;
}

1049 最后一块石头的重量

有一堆石头,用整数数组 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

尽量把石头分为重量相近的两堆,保证相撞后重量最小

所以要尽可能分成重量为 sum / 2 的石头堆,这样剩下的石头堆也是 尽可能接近 sum/2 的重量

转化为背包问题,容量为sum/2时能装入的最大重量

剩下重量为sum-dp[sum/2],sum/2向下取整,所以剩下的重量一定大于dp[sum/2]

最后返回剩下重量与dp[sum/2]的差即可

int max(int a,int b){return a>b?a:b;
}
/*
尽量把石头分为重量相近的两堆,保证相撞后重量最小
所以要尽可能分成重量为 sum / 2 的石头堆,这样剩下的石头堆也是 尽可能接近 sum/2 的重量
转化为背包问题,容量为sum/2时能装入的最大重量
剩下重量为sum-dp[sum/2],sum/2向下取整,所以剩下的重量一定大于dp[sum/2]
最后返回剩下重量与dp[sum/2]的差即可
*/
int lastStoneWeightII(int* stones, int stonesSize) {int dp[15005]={};//dp[j]表示背包容量为j时所能放的最大价值int sum=0;for(int i=0;i<stonesSize;i++){sum+=stones[i];}int t=sum/2;for(int i=0;i<stonesSize;i++){for(int j=t;j>=stones[i];j--){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}//sum向下取整,所以sum-dp[t]一定大于dp[t]return sum-dp[t]-dp[t];
}

总结:01背包问题,物品数量只有一个时,分为选和不选两种情况讨论

做题步骤

1、确定dp数组含义

2、确定递推公式

3、初始化

4、遍历。注意,二维dp数组遍历无顺序要求,一维dp数组必须先遍历物品,再遍历背包,并且背包要倒序遍历。循环内j>w[i]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/76995.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/76995.shtml
英文地址,请注明出处:http://en.pswp.cn/web/76995.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法时代的“摩西十诫”:AI治理平台重构数字戒律

一、引言 数字时代的狂飙突进中&#xff0c;人工智能&#xff08;AI&#xff09;正以颠覆性的力量重塑人类社会。从医疗诊断到金融决策&#xff0c;从智能制造到舆论传播&#xff0c;AI的触角已延伸至每个角落。 然而&#xff0c;斯坦福大学《2024年人工智能指数报告》揭示的…

上岸率85%+,25西电先进材料与纳米科技学院(考研录取情况)

1、先进材料与纳米科技学院各个方向 2、先进材料与纳米科技学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、材料科学与工程25年相较于24年上升10分&#xff0c;为290分 2、材料与化工&#xff08;专硕&#xff09;25年相较于24年下降20分&#xff0c;为…

Tomcat Web应用(Ubuntu 18.04.6 LTS)部署笔记

一、前言 本文与【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安装笔记】和【JDK&#xff08;Ubuntu 18.04.6 LTS&#xff09;安装笔记】同批次&#xff1a;先搭建数据库&#xff0c;再安装JVM&#xff0c;后面就是部署Web应用&#xff1a;典型的单机部署。   本着善…

Datawhale AI春训营——用AI帮助老人点餐

详细内容见官网链接&#xff1a;用AI帮助老人点餐-活动详情 | Datawhale

17.第二阶段x64游戏实战-人工遍历二叉树结构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;16.第二阶段x64游戏实战-分析二叉树结构 上一个内容里把二叉树的结构写了写&am…

Oracle 11g RAC ASM磁盘组剔盘、加盘实施过程

环境&#xff1a;AIX6.1 Oracle RAC 11.2.0.3 前期准备&#xff1a; 1.查看DG磁盘组空间情况&#xff1a; –查看DG磁盘组空间情况&#xff1a; ASMCMD> lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Of…

Java—— 正则表达式 方法及捕获分组

识别正则表达式的方法 方法名说明public String[] matches(String regex) 判断字符串是否满足 正则表达式的规则 public string replaceAll(String regex,string newstr) 按照正则表达式的 规则进行替换 public string[] split(String regex) 按照正则表达式的 规则切割字符串…

达梦并行收集统计信息

达梦收集统计信息速度如何&#xff1f; 答&#xff1a;1分钟1G 大库收集起来可能比较慢&#xff0c;想并行收集需要一些条件 3个参数先了解一下 我把max_parallel_degree改为16 相关说明可以看一下 对一个3G的表收集 收集方法 DBMS_STATS.GATHER_TABLE_STATS( TEST,T1,…

PyTorch 实战:Transformer 模型搭建全解析

Transformer 作为一种强大的序列到序列模型&#xff0c;凭借自注意力机制在诸多领域大放异彩。它能并行处理序列&#xff0c;有效捕捉上下文关系&#xff0c;其架构包含编码器与解码器&#xff0c;各由多层组件构成&#xff0c;涉及自注意力、前馈神经网络、归一化和 Dropout 等…

网页不同渲染方式的应对与反爬机制的处理——python爬虫

文章目录 写在前面爬虫习惯web 网页渲染方式服务器渲染客户端渲染 反爬机制使用session对象使用cookie让请求头信息更丰富使用代理和随机延迟 写在前面 本文是对前两篇文章所介绍的内容的补充&#xff0c;在了解前两篇文章——《爬虫入门与requests库的使用》和《BeautifulSou…

RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)

目录 前言:v4l-utils简介 一&#xff1a;查找当前的摄像头设备 二&#xff1a;查看当前摄像头支持的v4l2-ctl调试参数 三根据提示设置对应参数&#xff0c;在提示范围内设置 四&#xff1a;常用调试命令 五:应用内执行命令方法 前言:v4l-utils简介 v4l-utils工具是由Linu…

Spring Security基础入门

本入门案例主要演示Spring Security在Spring Boot中的安全管理效果。为了更好地使用Spring Boot整合实现Spring Security安全管理功能&#xff0c;体现案例中Authentication&#xff08;认证&#xff09;和Authorization&#xff08;授权&#xff09;功能的实现&#xff0c;本案…

Trae+DeepSeek学习Python开发MVC框架程序笔记(二):使用4个文件实现MVC框架

修改上节文件&#xff0c;将test2.py拆分为4个文件&#xff0c;目录结构如下&#xff1a; mvctest/ │── model.py # 数据模型 │── view.py # 视图界面 │── controller.py # 控制器 │── main.py # 程序入口其中model.py代码如下&#xff…

从认证到透传:用 Nginx 为 EasySearch 构建一体化认证网关

在构建本地或云端搜索引擎系统时&#xff0c;EasySearch 凭借其轻量、高性能、易部署等优势&#xff0c;逐渐成为众多开发者和技术爱好者的首选。但在实际部署过程中&#xff0c;如何借助 Nginx 为 EasySearch 提供高效、稳定且安全的访问入口&#xff0c;尤其是在身份认证方面…

CPU 虚拟化机制——受限直接执行 (LDE)

1. 引言&#xff1a;CPU虚拟化的核心问题 让多个进程看似同时运行在一个物理CPU上。核心思想是时分共享 (time sharing) CPU。为了实现高效且可控的时分共享&#xff0c;本章介绍了一种关键机制&#xff0c;称为受限直接执行 (Limited Direct Execution, LDE)。 1.1 LDE的基本…

linux 中断子系统链式中断编程

直接贴代码了&#xff1a; 虚拟中断控制器代码&#xff0c;chained_virt.c #include<linux/kernel.h> #include<linux/module.h> #include<linux/clk.h> #include<linux/err.h> #include<linux/init.h> #include<linux/interrupt.h> #inc…

容器修仙传 我的灵根是Pod 第10章 心魔大劫(RBAC与SecurityContext)

第四卷&#xff1a;飞升之劫化神篇 第10章 心魔大劫&#xff08;RBAC与SecurityContext&#xff09; 血月当空&#xff0c;林衍的混沌灵根正在异变。 每道经脉都爬满黑色纹路&#xff0c;神识海中回荡着蛊惑之音&#xff1a;"破开藏经阁第九层禁制…夺取《太古弑仙诀》……

基于c#,wpf,ef框架,sql server数据库,音乐播放器

详细视频: 【基于c#,wpf,ef框架,sql server数据库&#xff0c;音乐播放器。-哔哩哔哩】 https://b23.tv/ZqmOKJ5

精益数据分析(21/126):剖析创业增长引擎与精益画布指标

精益数据分析&#xff08;21/126&#xff09;&#xff1a;剖析创业增长引擎与精益画布指标 大家好&#xff01;在创业和数据分析的探索道路上&#xff0c;我一直希望能和大家携手共进&#xff0c;共同学习。今天&#xff0c;我们继续深入研读《精益数据分析》&#xff0c;剖析…

Spark-streaming核心编程

1.导入依赖‌&#xff1a; <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>3.0.0</version> </dependency> 2.编写代码‌&#xff1a; 创建Sp…