代码随想录算法训练营第35天|背包问题基础、46. 携带研究材料(01背包二维解法)(01背包一维解法)(acm)、416. 分割等和子集

本文主要是介绍代码随想录算法训练营第35天|背包问题基础、46. 携带研究材料(01背包二维解法)(01背包一维解法)(acm)、416. 分割等和子集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 0、背包问题基础
    • 01背包
  • 46. 携带研究材料(01背包)
    • 1、题目描述
    • 2、思路
    • 3、code(二维解法)
    • 3-1、code(一维解法)
    • 4、复杂度分析
  • 416. 分割等和子集
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析

0、背包问题基础

在这里插入图片描述

01背包

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

46. 携带研究材料(01背包)

题目链接:

1、题目描述

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。
小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

2、思路

非常标准的01背包问题

3、code(二维解法)

M, N = map(int, input().split())
weight = list(map(int, input().split()))
value = list(map(int, input().split()))
# 横坐标是材料,纵坐标是行李容量
dp = [[0 for _ in range(N+1)] for _ in range(M)]# dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值
for i in range(0,M):dp[i][0] = 0
for j in range(1,N+1):if weight[0]<=j:dp[0][j] = value[0]
for i in range(0,M):for j in range(1,N+1):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])print(dp[M-1][N])

3-1、code(一维解法)

在这里插入图片描述

M, N = map(int, input().split())
# M = 3 N = 2
weight = list(map(int, input().split()))
value = list(map(int, input().split()))
# dp[j]代表行李空间为j能够携带的研究材料的最大值 j = 0 1 2
dp = [0] * (N+1)
# print(dp)
for i in range(0,M): # 0 1 2 for j in range(N,weight[i]-1,-1): # 2 dp[j] = max(dp[j],dp[j-weight[i]]+value[i])# dp[2] = max(dp[2],dp[2-2] +...)
print(dp[N])

4、复杂度分析

1️⃣ 时间复杂度: O ( M × N ) O(M \times N) O(M×N)
2️⃣ 空间复杂度: O ( M × N ) O(M \times N) O(M×N)

416. 分割等和子集

题目链接:link

1、题目描述

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

2、思路

把01背包问题套到本题上来。

  • 背包的体积为sum / 2
  • 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  • 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。

3、code

class Solution:def canPartition(self, nums: List[int]) -> bool:# 物品重量为数值,价值为数值# 背包容量为总和的一半# 背包装满时获得的最大价值# 本体就是装满时(总和的一半)物品的数值和是否和背包容量一致if sum(nums) % 2 != 0:return Falsetarget = sum(nums) // 2# target = 11# dp[j]代表背包容量为j装的最大价值,j:0,1,2,,,,11dp = [0] * (target + 1)for i in range(len(nums)): # 物品从0,1,2,3 for j in range(target,nums[i]-1,-1): # 容量从11,,,,weight[0]dp[j] = max(dp[j],dp[j-nums[i]]+nums[i])if dp[target] == target:return Trueelse:return False

4、复杂度分析

1️⃣ 时间复杂度: O ( n 2 ) O(n^2) O(n2)
2️⃣ 空间复杂度: O ( n ) O(n) O(n)

这篇关于代码随想录算法训练营第35天|背包问题基础、46. 携带研究材料(01背包二维解法)(01背包一维解法)(acm)、416. 分割等和子集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136005

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求