算法系列--动态规划--背包问题(2)--01背包拓展题目

💕"2024.3.28小米汽车发布"💕
作者:Lvzi
文章主要内容:算法系列–动态规划–背包问题(2)–01背包拓展题目
在这里插入图片描述

大家好,今天为大家带来的是算法系列--动态规划--背包问题(2)--01背包拓展题目

1.分割等和⼦集

链接:
https://leetcode.cn/problems/partition-equal-subset-sum/
在这里插入图片描述

分析:
本题属于01背包问题

从数组中选择一些数据,使其刚好符合某种带限制条件的和,就符合01背包问题的思路

01背包问题就是选择一些物品,实现不超过背包最大容量的最大价值

本题是选择一些数,判断能够实现最大和刚好等于sum/2的情况

还有一个是在分析状态转移方程时,最后一个位置选或者不选也可以用01问题

代码:

class Solution {public boolean canPartition(int[] nums) {int n = nums.length;int sum = 0;for(int x : nums) sum += x;// 求和if(sum % 2 == 1) return false;// 特判int N = sum / 2;// 创建dp表boolean[][] dp = new boolean[n + 1][N + 1];dp[0][0] = true;// 初始化for(int i = 1; i <= nums.length; i++) {for(int j = 1; j <= sum / 2; j++) {dp[i][j] = (dp[i - 1][j]) || (j - nums[i - 1] >= 0 && dp[i - 1][j - nums[i - 1]]);}}// 返回值return dp[nums.length][sum / 2];}
}

空间优化后的代码:

class Solution {public boolean canPartition(int[] nums) {int n = nums.length, sum = 0;for(int x : nums) sum += x;if(sum % 2 == 1) return false;int N = sum / 2;boolean[] dp = new boolean[N + 1];dp[0] = true;for(int i = 1; i <= n; i++) for(int j = sum / 2; j >= nums[i - 1]; j--) dp[j] = dp[j] || dp[j - nums[i - 1]];return dp[sum / 2];}
}

2.⽬标和

链接:
https://leetcode.cn/problems/target-sum/
在这里插入图片描述

分析:

题目要求是必须用到数组里面的所有数字进行拼接(可正可负),判断可以拼接为target的最大组合数

首先,因为要用到数组中所有的数字,所以可以先把数组总和sum求出,接着我们可以把sum拆分为两部分,一部分是拼接+的数字总和a,另一部分是拼接-的总和b(b是大于0的,这里仅仅只是数字的相加),则可以得出:

  • a + b == sum
  • a - b == target

将两式相加可得:
a == (sum + target) / 2

示意图:
在这里插入图片描述

那么本道题就可以转化为在数组中挑选若干个数,使其和等于a的最大组合数,这不就是01背包问题吗!,在一个集合内部挑选若干个物品,在满足某个限制的前提下,实现xxxx

说明:求出a之后还需要判断是否越界,主要有两种不符合条件的情况:

  1. a < 0,因为本题的target可以是负数,所以a可能是负数,但是数组中的数全是大于0的,根部无法凑出一个小于0的数
  2. (sum + target) / 2 != 0:当除不尽的时候就代表不存在这样的a,也就无法凑出target,返回0

接下来就是动态规划的思路:

  1. 状态表示:
    • dp[i][j] :nums在[1,i]区间数字,和为j的最大组合数
  2. 状态转移方程
    • 和经典的背包问题一样,也是根据最后一个位置选或不选来推导状态转移方程,要注意的是,本题求的是最大组合数,也就是dp[i][j]应该是两种情况的总和
      在这里插入图片描述
  3. 初始化
    • 初始化主要考虑第一行和第一列
    • 在这里插入图片描述
  4. 填表顺序
    • 从左往右,从上往下
  5. 返回值
    • dp[n][a]

代码:

class Solution {public int findTargetSumWays(int[] nums, int target) {int a = 0, sum = 0;for(int n : nums) sum += n;// 求和a = (target + sum) / 2;// 计算目标值if(a < 0 || (sum + target) % 2 == 1) return 0;// 创建dp表int n = nums.length;int[][] dp = new int[n + 1][a + 1];dp[0][0] = 1;// 填表for(int i = 1; i <= n; i++) {for(int j = 0; j <= a; j++) {dp[i][j] = dp[i - 1][j];if(j - nums[i - 1] >= 0)dp[i][j] += dp[i - 1][j - nums[i - 1]];}}return dp[n][a];}
}

空间优化后的代码

class Solution {public int findTargetSumWays(int[] nums, int target) {int a = 0, sum = 0;for(int n : nums) sum += n;// 求和a = (target + sum) / 2;// 计算目标值if(a < 0 || (sum + target) % 2 == 1) return 0;// 创建dp表int n = nums.length;int[] dp = new int[a + 1];dp[0] = 1;// 填表for(int i = 1; i <= n; i++)for(int j = a; j >= nums[i - 1]; j--)// 注意优化后的便利顺序dp[j] += dp[j - nums[i - 1]];return dp[a];}
}

第一行不初始化,放到填表之中,也是背包问题常用的一种优化手段

3.最后⼀块⽯头的重量II

链接:
https://leetcode.cn/problems/last-stone-weight-ii/description/
在这里插入图片描述

分析:
本题的难点就在于转化,光看数字无法得出什么有效的结论,我们将数字换为字母,看能得出什么结论:
在这里插入图片描述

最后发现整个问题的思路很像目标和那道题目(就在上面),但是目标和那道题目最终求的是一个具体数字,本题要求的是最后的值的绝对值尽可能的小,还是套用和目标和一样的分析思路,整个数组的和是sum,可以根据匹配的符号不同分为两部分a,b

假设a>b,则求得就是a-b的最小值,对于数组中的每一个数都是选或不选,这就是01背包问题的特征,可以使用01背包问题的思路解决

状态表示:

  • dp[i][j]:在[1,i]区间内,选取一定的数字,在不超过j的前提下,可以实现的最大和

状态转移方程和初始化都比较简单,这里不再赘述

返回值:

  • 最终返回的应该是a-b的最小值a = dp[n][sum/2],那么b = sum - a,所以最终应该返回sum - 2 * dp[n][sum/2]
    在这里插入图片描述
class Solution {public int lastStoneWeightII(int[] stones) {int n = stones.length, sum = 0;for(int x : stones) sum += x;int[][] dp = new int[n + 1][sum/2 + 1];// 创建dp表// 填表for(int i = 1; i <= n; i++) {for(int j = 0; j <= sum/2; j++) {dp[i][j] = dp[i - 1][j];if(j - stones[i - 1] >= 0)dp[i][j] = Math.max(dp[i][j],dp[i - 1][j - stones[i - 1]] + stones[i - 1]);}}return sum - 2 * dp[n][sum/2];// 返回(a-b)绝对值的最小值}
}

空间优化后的代码:

class Solution {public int lastStoneWeightII(int[] stones) {int n = stones.length, sum = 0;for(int x : stones) sum += x;int[] dp = new int[sum/2 + 1];// 创建dp表// 填表for(int i = 1; i <= n; i++)for(int j = sum/2; j >= stones[i-1]; j--) dp[j] = Math.max(dp[j],dp[j - stones[i - 1]] + stones[i - 1]);return sum - 2 * dp[sum/2];// 返回(a-b)绝对值的最小值}
}

以上就是算法系列--动态规划--背包问题(2)--01背包拓展题目全部内容,下一篇文章将会带来完全背包问题的介绍,敬请期待,我是LvZi

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

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

相关文章

史上最全-Java面试题(涵盖基础、高级、框架、微服务、中间件、大厂真题等28个大类超3000+面试题,全部附带详细答案)

3月4月又到了一年一度的跳槽黄金期,无论几年经验,也无论技术能力如何,跳槽前都离不开面试准备,其中刷面试题是重中之重。 刷面试题的时候一大痛点就是太分散了,需要自己根据知识点一项一项的去搜,容易遗漏知识点而且面试题质量无法保证,非常痛苦,基于此我花了两个月的…

AOP切入点表达式基本格式

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 官方地址 https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/pointcuts.html AOP切入点表达式基本格式如下&#xff1a; execution(modifiers-patte…

java针对:Sharing is only supported问题解决

#错误解决 当你运行出现报错&#xff1a;Java HotSpot™ 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 问题翻译&#xff1a;Java HotSpot™ 64 位服务器 VM 警告&#xff1a;仅引导加载程序类…

OneDiff加速“图生生”,解锁电商AI图像处理新范式

2024年&#xff0c;电商领域正目睹生成式AI软件工具的飞速发展&#xff0c;AI Generated Content (AIGC) 技术在电商应用中的普及率正在显著提升&#xff0c;这类技术能够显著提高商业运营的效率&#xff0c;并促进业绩的稳步增长。 硅基流动研发的图片/视频生成推理引擎OneDif…

Linux:Jenkins:参数化版本回滚(6)

上几章我讲到了自动集成和部署 Linux&#xff1a;Jenkins全自动持续集成持续部署&#xff08;4&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136977106 当我们觉得这个页面不行的时候&#xff0c;需要进行版本回滚&#xff0c;回滚方法我这里准备了…

Hello算法2:复杂度分析

Hello算法2&#xff1a;复杂度分析 本文是基于k神的Hello 算法的读书笔记&#xff0c;请支持实体书。 https://www.hello-algo.com/chapter_paperbook/ 算法效率 算法效率评估 设计算法时&#xff0c;我们追求以下两个目标&#xff1a; 找出解法找出最优解 最优解通常包含…

实验7 内置对象response

编写代码&#xff0c;掌握request、response的用法。【参考课本4.6.2】 三、源代码以及执行结果截图&#xff1a; input.jsp <% page language"java" contentType"text/html; charsetutf-8" pageEncoding"utf-8"%> <!DOCTYPE html>…

Redis面试题-缓存穿透,缓存击穿,缓存雪崩

1、穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 解释&#xff1a;请求的数据既不在Redis中也不在数据库中&#xff0c;这时我们创建一个黑名单来存储该数据&#xff0c;下次再有类似的请求进来…

Q-Day提前?IBM警告:「量子+AI」将触发巨大风险!

Q-Day&#xff0c;即量子计算机强大到足以破解当前加密方案的时刻&#xff0c;原本被视为一个从近期到长期可能面临的挑战&#xff0c;而非刻不容缓的现实问题。然而&#xff0c;最新的研究发现似乎加速了这一天的到来。 IBM的研究团队在一篇论文中提出&#xff0c;混合量子经典…

Redis入门到实战-第二十二弹

Redis实战热身Sentinel篇 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理和流处理引擎的内存…

谷歌DeepMind推出SIMA智能体,可以跟人一起玩游戏

谷歌 DeepMind 推出了 SIMA&#xff0c;这是一种通过训练学习游戏技能的人工智能代理&#xff0c;因此它玩起来更像人类&#xff0c;而不是一个只做自己事情的强大人工智能。 从早期与 Atari 游戏合作&#xff0c;到以人类大师级别玩《星际争霸 II》的 AlphaStar 系统&#xf…

【STM32CubeMX(2)】点亮第一个LED灯

通过本节可以学习到&#xff1a; 如何通过STM32CubeMX建立一个单片机工程如果是仿真下载需要注意些什么怎么通过HAL库使用外设功能 软件环境&#xff1a; STM32CubeMX version6.10.0 Keil_v5&#xff08;MDK-ARM&#xff09; version 5.32 硬件环境&#xff1a; STM32F103…

Mysql数据库:主从复制与读写分离

目录 前言 一、Mysql主从复制概述 1、Mysql主从复制概念 2、Mysql主从复制功能和使用场景 2.1 功能&#xff08;为何使用主从复制&#xff09; 2.2 适用场景&#xff08;何时使用主从复制&#xff09; 3、Mysql复制的类型 3.1 基于SQL语句的复制&#xff08;Statement默…

数字化对制造业生产效率的影响与优化策略

导 读 ( 文/ 1419 ) 在当今竞争激烈的市场环境下&#xff0c;制造业企业面临着日益增长的压力&#xff0c;需要不断提高生产效率以保持竞争力。数字化技术作为一种重要的生产力工具&#xff0c;已经在制造业中得到广泛应用。本文将探讨数字化对制造业生产效率的影响&#xff0c…

python可视化:tqdm进度条控制台输出模块

前言 在处理大量数据或执行耗时操作时&#xff0c;了解代码执行的进度是至关重要的。在Python中&#xff0c;通过使用进度条可以有效地实现对代码执行进度的可视化展示。 tqdm 是一个快速、可扩展的Python进度条库&#xff0c;能够实时显示代码执行的进度。并且它提供了简洁的A…

用Python机器学习模型预测世界杯结果靠谱吗?

看到kaggle、medium上有不少人用球队的历史数据来进行建模预测&#xff0c;比如用到泊松分布、决策树、逻辑回归等算法&#xff0c;很大程度上能反映强者恒强的现象&#xff0c;比如巴西、英格兰等大概率能进8强&#xff0c;就像高考模拟考试成绩越好&#xff0c;大概率高考也会…

Spring高级面试题-2024

Spring 框架中都用到了哪些设计模式&#xff1f; 1. 简单工厂&#xff1a; ○ BeanFactory&#xff1a;Spring的BeanFactory充当工厂&#xff0c;负责根据配置信息创建Bean实例。它是一种工厂模式的应用&#xff0c;根据指定的类名或ID创建Bean对象。2. 工厂方法&#xff…

爬取肯德基餐厅查询中指定地点的餐厅数据

进入肯德基官网 代码编写 import requests import jsonif __name__ __main__:get_url http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?opkeywordheaders {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1…

开源AI引擎:利用影像处理与目标检测技术对违章建筑排查

一、项目案例介绍 随着城市化进程的加快&#xff0c;城市规划和管理工作面临着前所未有的挑战&#xff0c;违章建筑的排查与处理成为了城市管理中的一项重要任务。传统的违章建筑排查方法依赖于人力巡查&#xff0c;效率低下且难以全面覆盖。为了解决这一问题&#xff0c;现代…

Webgl学习系列-Webgl 入门

Webgl学习系列 第二章 Webgl 入门 文章目录 一、最短的webgl程序二、通过webgl绘制一个点三、webgl三维坐标 一、最短的webgl程序 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title>…