代码随想录算法训练营第35天|01背包理论基础、01背包理论基础(滚动数组)、416. 分割等和子集

news2024/11/15 19:40:11

打卡Day35

  • 1.01背包理论基础
  • 2.01背包理论基础(滚动数组)
  • 3.416. 分割等和子集

1.01背包理论基础

题目链接:01背包理论基础
文档讲解: 代码随想录

在这里插入图片描述

01背包:
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。它的暴力解法,每个物品的状态只有两个,取或者不取,可以使用回溯法搜索出所有情况,时间复杂度为 o ( 2 n ) o(2^n) o(2n)

动规五部曲:
(1)确定数组和下标含义
dp[ i ][ j ]表示从下标0~i的物品里任意取,放进容量为 j 的背包,价值总和最大值
(2)确定递推关系式
可以从两个角度进行分析,对于dp[ i ][ j ],可以放入物品 i,也可以不放。不放物品 i,由dp[ i-1 ][ j ]。放入物品 i,由dp[ i-1 ][ j - weight[i]] + value[ i ]。因此递推公式为dp[ i ][ j ] = max(dp[ i-1 ][ j ],dp[ i-1 ][ j - weight[i]] + value[ i ])。
(3)初始化
从递推关系式出发,dp[0][ j ]需要赋值,放入物品 0 时,各种背包容量的价值总和,其中当背包容量小于weight[0]时,不放入物品,价值为0,反之为value[0]。当背包容量为0时,放不进任何物品,则dp[ i ][0] = 0。
(4)遍历顺序
观察递推关系式,dp[ i ][ j ]主要由dp[ i-1 ][ j ]和dp[ i-1 ][ j - weight[i]]求到,只要上方和左上方有值就可以,因此两层循环遍历背包和物品的顺序无论先后,都可以得到答案。
(5)打印数组

M, N = [int(x) for x in input().split()]
space = [int(x) for x in input().split()]
value = [int(x) for x in input().split()]

#任取0~i的物品放入背包容量j的最大价值,i行j列
dp = [[0] * (N + 1) for _ in range(M)] 

#初始化
for j in range(space[0], N + 1):
    dp[0][j] = value[0]

#遍历
for i in range(1, M):
    for j in range(1,N + 1):
        if j >= space[i]:
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - space[i]] + value[i])
        else:
            dp[i][j] = dp[i - 1][j]

print(dp[M - 1][N])

2.01背包理论基础(滚动数组)

题目链接:01背包理论基础
文档讲解: 代码随想录

(1)确定数组和下标的含义
dp[ j ]表示背包容量为 j 时物品的最大价值
(2)递推关系式
二维数组的递推关系完全可以将dp[i - 1]那一层拷贝到dp[i]上,因此,递推关系式为dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
(3)初始化
一定要和dp数组的定义吻合,dp[0] = 0,因为递推关系式是取最大值,因此其余位置可以初始化为0
(4)遍历顺序
两层循环,一个 i,一个 j。但 j 是从后往前,因为如果从前往后,物品0会被重复加入多次。二维数组dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖!二维数组循环遍历的时候,背包和物品的顺序可以对调,但是在一维数组中,不可以换,因为一旦先遍历背包,背包是倒序遍历的,这样子每个dp[j]就只会放入一个物品。
(5)打印数组

kind, bagspace = [int(x) for x in input().split()]
space = [int(x) for x in input().split()]
value = [int(x) for x in input().split()]

#新建dp数组,初始化为0
dp = [0] * (bagspace + 1)

for i in range(kind):
    for j in range(bagspace, space[i] - 1, -1):
            dp[j] = max(dp[j], dp[j - space[i]] + value[i])

print(dp[bagspace])

3.416. 分割等和子集

题目链接:416. 分割等和子集
文档讲解: 代码随想录

如果可以分割为两个子集数值和相等,那么就可以抽象为背包问题,背包容量为该数组值总和的一半,问是否存在元素将其装满。这是一个01背包问题,因为其中每个数字只能用一次。同时,需要注意的是,每个元素的重量和价值均为元素的数值。
(1)确定dp数组和下标
dp[ j ]表示容量 j 的背包可以装下的最大重量
(2)递推关系式
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
(3)初始化
从定义来看,dp[0] = 0,因为是取最大值,为了在取值时不被初始值覆盖,因此选择非负的最小值0,来初始化其余下标不为0的元素
(4)遍历顺序
采用一维数组,因此 i 从前往后遍历数组元素, j 从后往前遍历背包容量
(5)打印数组

class Solution(object):
    def canPartition(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        kind = len(nums)
        summ = sum(nums)
        if summ % 2 == 1:
            return False
        else:
            bagweight = summ / 2
        
        dp = [0] * (bagweight + 1)
        for i in range(kind):
            for j in range(bagweight, nums[i] - 1, -1):
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
        
        if dp[bagweight] == bagweight:
            return True
        else:
            return False
class Solution(object):
    def canPartition(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        #精简版
        if sum(nums) % 2 != 0:
            return False
        target = sum(nums) / 2
        dp = [0] * (target + 1)
        for num in nums:
            for j in range(target, num - 1, -1):
                dp[j] = max(dp[j], dp[j - num] + num)
        if dp[target] ==target:
            return True
        return False

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

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

相关文章

Studying-代码随想录训练营day50| 图论理论基础、深搜理论基础、98. 所有可达路径、广搜理论基础

第50天,图论开始!最后的刷题冲刺!💪(ง •_•)ง,编程语言:C 目录 图论理论基础 图的基本概念 图的种类 度 连通性 连通图(无向图概念) 强连通图(有向图概念&…

全局统一的异常处理方案

1. 在Common包中统一定义异常处理类 2. 在common包中定义异常拦截器 ExceptionHandler(BusinessException.class):表示要拦截的异常类型为BusinessException 3. 在自己的项目中使用这个全局异常拦截器 继承CommonControllerAdvice并且配上ControllerAd…

MySQL数据库-事务

一、什么是事务 1.概念 事务(Transaction):一个最小的不可再分的工作单元,一个事务对应一个完整的业务,一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成,事务只针对DML语句。 数据…

天气曲线echarts

1. 用多x轴实现日期&#xff0c;图标&#xff0c;控制定位固定显示高度 2.背景遮罩抛开echarts另外用div 3.设置grid的offset控制温度折线的范围 html <div class"right_bottom"><basicEchartsstyle"height: 400px; width: 1200px":option"c…

在Windows上用虚拟机安装统信UOS专业版教程

事情的起因 就是我想要一台华为电脑&#xff0c;然后上网搜索选购攻略。然后看到了一个新闻&#xff0c;就是英特尔&#xff0c;高通对华为停止供应&#xff0c;然后华为要研发自己的CPU操作系统 然后我也不了解&#xff0c;继续搜索&#xff0c;就好像是这个操作系统 统信UO…

【轨物推荐】康波、世界体系与创新范式:中国如何引爆新一轮产业革命

原创 邵宇、陈达飞 新财富 2019年12月31日 22:13 中美关系近两年备受关注&#xff0c;在诸多方面各方都已经形成了共识&#xff0c;但竞争博弈的结局富有争议性。当靠事物太近的时候&#xff0c;反而很难看清楚其面貌&#xff0c;使用康德拉季耶夫周期&#xff08;简称“康波”…

来自工业界的开源知识库 RAG 项目结构化文件解析方案比较

背景介绍 在过去实践 RAG 的过程中&#xff0c;深刻体会到 RAGFlow 提出的 "Quality in, quality out", 只有高质量的文件处理才能获得良好的 RAG 效果。 RAG 的第一步是对文件进行解析&#xff0c;由于 Embedding 和 LLM 模型的长度限制&#xff0c;往往需要将解析…

Python批量下载音乐功能

Python批量下载音乐功能 Python批量下载音乐,调用API接口,同时下载歌曲和歌词 先安排一下要用的模块&#xff0c;导入进来。 import re import json import requests目录结构 下载音乐 Awking_Class.pymusic.txt 文件文件写的是音乐名字,使用换行分割 new_music 注意这个 ne…

[极客大挑战 2019]Secret File-web

打开题目 查看源码 直接访问Archive_room.php 第二个页面是个点击框&#xff0c;这里bp抓包确认&#xff1b;若是直接SECRET&#xff0c;会跳到end.php 直接访问secr3t.php 代码审计一下 playload&#xff1a;secr3t.php?fileflag.php 改为php协议读取权限 secr3t.php?f…

CAPL使用结构体的方式组装一条DoIP车辆声明消息(方法1)

如果你参加过我的《CAPL编程系统性课程》,你就结构体类型天然就能表示报文结构,用结构体表示报文虽然麻烦,但灵活度更高。 我们今天试着用结构体类型表示DoIP车辆声明消息的DoIP报头,然后组装一条DoIP消息发送出去。 DoIP消息结构如下: DoIP车辆声明消息结构如下: /**…

SPSSAU | Power功效分析之线性回归

Power功效分析常用于实验研究时样本量的计算&#xff08;或功效值计算&#xff09;&#xff0c;如果是涉及线性回归相关的回归系数差异计算时&#xff0c;SPSSAU共提供三种情况时的Power功效分析&#xff0c;具体如下表格所述&#xff1a; 名词说明R 方值线性回归时R 方值或者…

大数据信用查询什么样的平台比较靠谱?

随着互联网的发展和普及&#xff0c;大数据技术逐渐应用到各行各业中&#xff0c;其中之一就是信用查询领域&#xff0c;大数据信用查询平台能够为用户提供全面、准确的大数据信用评估&#xff0c;然而&#xff0c;由于市场上出现了许多不同的大数据信用查询平台&#xff0c;我…

NICE Seminar(2022-1-23)基于进化优化的鲁棒区间搜索(华东理工大学堵威博士)

论文题目&#xff1a;Searching for Robustness Intervals in Evolutionary Robust Optimization 关于非支配解附近较高质量解搜集的工作。

DC-7靶机通关

今天咱们来学习第七个靶机&#xff01;&#xff01;&#xff01; 1实验环境 攻击机&#xff1a;kali2023.2 靶机&#xff1a;DC-7 2.1主机发现 2.2端口扫描 依旧是开了两个端口&#xff0c;一个 22 一个 80 &#xff01;&#xff01;&#xff01; 3.1查看对方网页 在这里我…

数据结构_study(六)

图 顶点的有穷非空集合和顶点之间边的集合 G(V,E)&#xff0c;G&#xff1a;图&#xff0c;V&#xff1a;顶点集合&#xff0c;E&#xff1a;边的集合 顶点&#xff1a;图中的数据元素&#xff0c;有穷&#xff0c;非空 边&#xff1a;顶点之间的逻辑关系&#xff0c;边集合…

如何编写一个多线程、非阻塞的python代码

一、【写在前面】 最近csdn每天写两篇文章有推广券&#xff0c;趁这个机会写一个python相关的文章吧。 一般我们的任务都可以分为计算密集型任务和IO密集型任务。 python因为全局GIL锁的存在&#xff0c;任何时候只有一个python线程在运行&#xff0c;所以说不能利用多核CPU…

基于人工智能技术开发的一种医疗诊断工具:智慧3D导诊系统源码

概述 智能导诊基于医疗 AI 、自然语言处理技术&#xff0c;覆盖导诊、智能问答、科普宣教等就医服务&#xff1b;智能导诊通过人体图、症状列表等形式进行疾病自测&#xff0c;快速推荐就诊科室、医生推荐。产品可应用于微信线上挂号、互联网医院、区域平台等场景中&#xff0…

【搜索核心技术】经典搜索核心算法:BM25及其变种

随着基于检索增强的生成&#xff08;Retrieval-Augmented Generation—RAG&#xff09;逐渐成为当前大模型落地方案的主流选择&#xff0c;搜索技术在这一过程中扮演着至关重要的角色。然而&#xff0c;仅依赖向量相似性检索往往无法达到理想的效果。因此&#xff0c;为了进一步…

计算机网络之http状态码和https

目录 HTTP协议 TCP/IP协议 TCP/IP的分层管理 各个协议和HTTP之间的关系 了解并区分URI和URL 返回结果的HTTP状态码 2XX 成功 2.1 200 ok 2.2 204 No Content 2.3 206 Partial Content 3xx表示重定向 3.1 301 Moved Permanently 3.2 302 Found 3.3 303 See …