DAY42:01背包问题+应用

01背包问题

下述背包问题的分类很详细

代码随想录

在leetcode中主要涉及到01背包和完全背包问题的应用题,因此先从01背包的原理开始学习。

01背包问题:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

暴力解法复杂度:物品存在取和不取的两种状态,因此是2^N复杂度,因此需要动态规划的方式来解决。

二维背包问题

1、确定数组及下标

dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

2、递推公式

有两个方向推出来dp[i][j],

不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。)

放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值

所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

3、初始化

如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。

dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。

当j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。

4、递归逻辑

需要遍历物品和背包容量

01背包(滚动数组)

代码随想录

上面我们使用了二维数组来进行状态更新,但是如果将dp[i-1]的状态更新到dp[i]上,就可以使用一维数组,称为滚动数组。

1、确定dp数组定义

在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。

2、递归公式

dp[j]可以通过dp[j - weight[i]]推导出来,dp[j - weight[i]]表示容量为j - weight[i]的背包所背的最大价值。

此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,

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

3、初始化

dp[0]=0,其他都初始化为0

4、遍历顺序

for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}

倒序遍历是为了保证物品i只被放入一次!。但如果一旦正序遍历了,那么物品0就会被重复加入多次!并且一定要先遍历物品再遍历背包容量。

Leetcode: 416 分割等和子集

这道题转化为背包问题,

1、dp的定义

dp[j]容量为j的背包,所背的物品价值最大可以为dp[j]。只是这道题目中背包的价值和重量都是nums[i]

2、递归公式

所以递归公式为dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);

3、特殊处理

如果背包的总和为奇数的话,肯定不能分为两个子集,所以可以先剪枝进行判断。

同时这道题需要注意物品的重量和价值是一样的,所以递推公式中dp[j-nums[i]]就是没放进去的价值再加上num[i]就是总体价值。

总背包的重量为sum/2,找到一半就可以了,如果找到的重量==一半的重量就是true。其他情况就是false。

时间复杂度:O(n^2)

空间复杂度:O(n)

class Solution {
public:bool canPartition(vector<int>& nums) {int result = 0;//需要初始化,没有初始化为0会报错for(int i = 0; i < nums.size(); i++){result += nums[i];}if(result % 2 == 1) return false;result = result / 2;//更新背包的重量vector<int> dp(result + 1, 0);//确定dp数组的大小for(int i = 0; i < nums.size(); i++){for(int j = result; j >= nums[i]; j--){//背包问题dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);}}if(dp[result] == result) return true;return false;}
};

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

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

相关文章

软件测试-造数工具Faker简介

这里的Faker不是英雄联盟的Faker。。。 一、Python Faker 简介 Python Faker 是一个用于生成假数据的Python库。它允许开发者快速创建具有随机特征的虚构数据&#xff0c;这对于测试、填充数据库以及其他需要模拟真实数据的场景非常有用。Python Faker 提供了各种数据类型的生…

ubuntu22.04@laptop OpenCV Get Started: 000_hello_opencv

ubuntu22.04laptop OpenCV Get Started: 000_hello_opencv 1. 源由2. Hello OpenCV2.1 C应用Demo2.2 Python应用Demo 3. 参考资料 1. 源由 之前&#xff0c;通过敲门砖已经砸开了OpenCV的大门&#xff0c;接下来是体验下“Hello World&#xff01;”程序。 2. Hello OpenCV …

第十九讲_HarmonyOS应用页面和自定义组件生命周期

HarmonyOS应用页面和自定义组件生命周期 1. 什么叫页面2. 什么叫自定义组件3. 页面的生命周期4. 自定义组件的生命周期5. 一个页面的生命周期流程 1. 什么叫页面 页面&#xff1a;即HarmonyOS应用的UI页面。 由一个或者多个自定义组件组成Entry装饰的自定义组件为页面的入口组…

《动手学深度学习(PyTorch版)》笔记7.3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

Vue3自定义PostCss插件

Vue3自定义PostCss插件 插件功能: 实现自动转px为vw功能 1. 创建插件ts文件2. tsconfig.node.json引入插件3. vite.config.ts增加插件配置4. 编写插件内容5. 示例 插件功能: 实现自动转px为vw功能 px 固定单位,不会随着屏幕的变化而变化 vh vw 相对于视口高宽进行控制 1. 创建…

LeetCode541. 反转字符串 II

541. 反转字符串 II 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0…

[UI5 常用控件] 07.SplitApp,SplitContainer

文章目录 前言1. SplitApp1.1 组件结构1.2 Demo1.3 mode属性 2. SplitContainer 前言 本章节记录常用控件SplitApp&#xff0c;SplitContainer。主要功能是在左侧显示Master页面&#xff0c;右侧显示Detail页面。 Master页面和Detail页面可以由多个Page组成&#xff0c;并支持…

BEV感知算法学习

BEV感知算法学习 3D目标检测系列 Mono3D(Monocular 3D Object Detection for Autonomous Driving) 流程&#xff1a; 通过在地平面上假设先验&#xff0c;在3D空间中对具有典型物理尺寸的候选边界框进行采样&#xff1b;然后我们将这些方框投影到图像平面上&#xff0c;从而避…

SpringBoot实战第三天

今天主要完成了&#xff1a; 新增棋子分类 棋子分类列表 获取棋子分类详情 更新棋子分类 更新棋子分类和添加棋子分类_分组校验 新增棋子 新增棋子参数校验 棋子分类列表查询(条件分页) 先给出分类实体类 Data public class Category {private Integer id;//主键IDNot…

Spring- FactoryBean接口中的getObject()方法

目录 一、Spring框架介绍 二、FactoryBean接口是什么 三、getObject()方法如何使用 一、Spring框架介绍 Spring框架是一个轻量级的、非侵入式的Java企业级应用开发框架&#xff0c;以IoC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;为核心思…

阿里云服务器租用费用_2024年2月最新价格表

2024年2月阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核…