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

01 背包

文档讲解:代码随想录

题目链接:46. 携带研究材料(第六期模拟笔试)

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

 暴力解法:每个物品都有放与不放两种状态,复杂度是2的n次方

动态规划:

dp[i][j] :下标为[0,i]之间的物品,任取放进容量为j的背包里的最大价值

必须是把dp数组定义为答案,然后找递推关系,反推到起点,然后双循环搞定

 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]   )

dp数组初始化

初始化很有讲究

由 dp[i][j]  = max(dp[i-1][j] ,dp[i-1][j-weight[i]] + value[i]   )可以看出:dp[i][j]由它的左上方和正上方推出来的

所以要初始化第一行和第一列,dp[i][j]与它原来的值没有关联,所以初始化成什么值都可以

 遍历顺序

两层for循环,一个遍历物品,一个遍历背包的容量

对于二维数组实现的01背包,两层for循环是可以颠倒的,先遍历物品还是先遍历背包都可以

当前元素是由正上方和左上方推导出来的,如果要求当前元素的值,一定要确定左上方有值,正上方有值

如果先遍历物品,再遍历背包,那么就是一行一行的遍历,满足上方和左上方有数据,所以这个遍历方式是可以的

如果先遍历背包,再遍历物品,那么就是一列一列的遍历,满足上方和左上方有数据,所以这个遍历方式也是可以的

所以,对于二维数组实现的01背包,无论先遍历背包还是物品,要求的格子的值,满足左上方和正上方都有值,所以两种遍历方式都可以

def backpack(M,N,space,value):
    bp = [[0 for j in range(N+1)] for i in range(M)]
    #第一列都是0,初始化第一行
    for i in range(1,N+1):
        if space[0] > i:
            continue
        else:
            bp[0][i] = value[0]
    
    #先遍历物品,再遍历背包
    for i in range(1,M):
        for j in range(1,N+1):
            if space[i] <= j: #能放下i
            
                bp[i][j] = max(bp[i-1][j],bp[i-1][j-space[i]]+value[i])
            else:#不能放下i

                bp[i][j] =bp[i-1][j]
    return (bp[M-1][N])
    
M, N = map(int, input().split())
space = list(map(int, input().split()))
value = list(map(int, input().split()))

# 计算并输出结果
print(backpack(M, N, space, value))

注意:dp[i][j]  = max(dp[i-1][j] ,dp[i-1][j-weight[i]] + value[i]  ) 要保证[j-weight[i]]下标大于等于0才可以,也就是容量大于等于weight[i],也就是说,只有当容量大于i所占的空间时,才会考虑放不放i的问题,反之,那么肯定不会放物品i

动态规划:01背包理论基础(滚动数组)

用一维数组实现01背包

用二维数组实现01背包:dp[i][j]  = max(dp[i-1][j] ,dp[i-1][j-weight[i]] + value[i] ) 

可以看出当前层的数值是由上一层推导出来的,是不是就可以把i-1的数据拷贝到第i层,直接在第i层上进行操作,不断覆盖原来的数据

dp[j]:容量为j的背包所能装的物品的最大价值是dp[j]

递推公式

不放物品i的状态就是dp[j]

放物品i:dp[j-weight[i]] + value[i]

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

初始化

dp[0] = 0

应该初始化一个非0中的最小值,这样取最大值不会覆盖递归出来的数据

遍历顺序

放物品i:dp[j-weight] + value[i]   这样写是因为在二维数组中dp[i-1][j-weight]中一定是没有物品i的,并且给物品i额外保留了位置,

举一个例子:物品0的重量weight[0] = 1,价值value[0] = 15

如果正序遍历

dp[1] = dp[1 - weight[0]] + value[0] = 15  容量为1的背包中对于放不放物品0的判断

dp[2] = dp[2 - weight[0]] + value[0] = 30   容量为2的背包中对于放不放物品0的判断,但是dp[2 - weight[0]]之前已经判断过是否加入0背包了,可能是加入的,这就会造成重复

倒叙遍历保证每个物品被添加一次

不太懂

416. 分割等和子集

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

这是一个0、1背包问题

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

背包问题有多种背包方式,常见的有:01背包、完全背包、多重背包、分组背包和混合背包等等。

要注意题目描述中商品是不是可以重复放入。

即一个商品如果可以重复多次放入是完全背包,而只能放入一次是01背包,写法还是不一样的。

要明确本题中我们要使用的是01背包,因为元素我们只能用一次。

回归主题:首先,本题要求集合里能否出现总和为 sum / 2 的子集。

那么来一一对应一下本题,看看背包问题如何来解决。

只有确定了如下四点,才能把01背包问题套到本题上来。

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

以上分析完,我们就可以套用01背包,来解决这个问题了。

重量和价值一样,当背包正好装满之后,最大价值就是11,那么就是true

递推公式

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

初始化

dp[0] = 0

遍历顺序

和上题一样,是倒叙遍历

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        #先判断是不是奇数
        if sum(nums) % 2!=0:
            return False
        sum_num = int(sum(nums)/2)
        print(sum_num)
        dp = [0] * (sum_num+1) 
        
        for i in nums:#遍历物品
            for j in range(sum_num,i-1,-1):
                dp[j] = max(dp[j],dp[j-i]+i) #j要大于等于i才有意义,但是不知道为什么j小于i时,没有报错
        if dp[-1] == sum_num:
            return True
        else:
            return False

疑问:j要大于等于i才有意义,但是不知道为什么j小于i时,没有报错。只是结果会有问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day-04python模块

一、模块 1-1 Python 自带模块 Json模块 处理json数据 {"key":"value"} json不是字典 本质是一个有引号的字符串数据 json注意点 {} 中的数据是字符串引号必须是双引号 使用json模块可以实现将json转为字典&#xff0c;使用字典的方法操作数据 。 或者将…

自动驾驶中的长尾问题

自动驾驶中的长尾问题 定义 长尾问题&#xff08;Long-Tail Problem&#xff09;是指在数据分布中&#xff0c;大部分的数据集中在少数类别上&#xff0c;而剩下的大多数类别却只有少量的数据。这种数据分布不平衡的现象在许多实际应用中广泛存在&#xff0c;特别是在自动驾驶…

自适应Q的容积卡尔曼滤波MATLAB例程|完整代码

前言 给出自适应容积卡尔曼滤波&#xff08;ACKF&#xff09;的MATLAB代码。 主要思想 通过自适应状态协方差Q来实现&#xff0c;得到了比传统方法更低的估计误差。适用于Q无法获取、估计不准、变化不定的情况&#xff0c;只有一个M文件&#xff0c;方便运行&#xff0c;保运…

一分钟学习数据安全——自主管理身份SSI基本概念

之前我们已经介绍过数字身份的几种模式。其中&#xff0c;分布式数字身份模式逐渐普及演进的结果就是自主管理身份&#xff08;SSI&#xff0c;Self-Sovereign Identity&#xff09;。当一个人能够完全拥有和控制其数字身份&#xff0c;而无需依赖中心化机构&#xff0c;这就是…

3D轻量化的三大应用解决方案

老子云平台https://www.laozicloud.com/ 为不同应用场景提供了三大解决方案。 01 单模型轻量化解决方案 数字化时代&#xff0c;越来越多的C2M定制、文旅、电商等行业&#xff0c;为了开拓市场&#xff0c;提升企业竞争力&#xff0c;开始把目光投向产品的3D展示交互。 单模…

Fragment后续

1.Fragment 生命周期 2.Fragment动态注册 2.1 activity package com.tiger.mystudyactivity;import android.graphics.Color; import android.os.Bundle; import android.util.TypedValue;import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager.widge…

VirtualBox7.x下载安装CentOS7安装网络配置

1、VirtualBox7.x下载安装 1.1、VirtualBox7.x下载 1.1.1、去哪里下载&#xff1f; 一般我们去官方网站&#xff08;https://www.virtualbox.org/wiki/Downloads&#xff09;下载、但国内访问速率较慢&#xff0c;更有甚者下载速度仅仅只有0.1kb/s&#xff0c;极大的拖延了项…

环境变量 | 是不是必须配置?怎么配置?

本文基于mysql和python环境&#xff0c;简单介绍了“什么是环境变量”、“环境变量是不是必须配置”、“环境变量配置方法”及“常用环境变量 path ”。 1、什么是环境变量 释义&#xff1a;一般是指在操作系统中&#xff0c;用来指定操作系统运行环境的一些参数&#xff0c;…

前端开发的未来:回归简约,还是拥抱复杂?

今天和大家分享一篇国外大佬的文章&#xff0c;他提出了一个很有意思的观点——我们熟悉的前端开发正在逐渐消亡&#xff0c;并预测我们很快会回到最初的状态。让我们一起来探讨一下他的观点&#xff0c;看看你是赞同&#xff0c;欢迎大家在评论区探讨和交流。 回顾前端开发的历…

picoLLM:大模型的量化魔术师 上

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

易语言推箱子游戏(附带源码)

易语言推箱子游戏 易语言易语言的安装易语言功能特色易语言安装步骤易语言常见问题 导入游戏源码部分源码领取源码下期更新预报 易语言 易语言&#xff08;EPL&#xff09;是一门以中文作为程序代码编程语言&#xff0c;其以“易”著称&#xff0c;创始人为吴涛。易语言早期版…

数字孪生在气象灾害防治中的重要贡献

数字孪生技术在气象灾害防治中正发挥着越来越重要的作用。数字孪生是指通过数字化方式在虚拟空间中构建与现实世界对应的虚拟模型&#xff0c;通过实时数据和模拟技术进行动态映射和交互。利用数字孪生技术&#xff0c;气象部门可以更高效、更精准地监测、预测和应对气象灾害&a…

德人合科技——天锐绿盾内网安全管理软件 | -文档透明加密模块

天锐绿盾文档加密功能能够为各种模式的电子文档提供高强度加密保护&#xff0c;丰富的权限控制以及灵活的应用管理&#xff0c;帮助企业构建更严密的立体保密体系。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee ————…

退出登录后选择记住登录状态回显用户名和密码

项目背景 : react ant 需求 : 退出登录后 , 选择了记住登录 , 回显用户名和密码 ; 未选择记住 , 则不回显用户名和密码 如图注意 : 发现一个鸡肋的问题 , 未勾选退出后 , 还是会回显 , 后来我查看了cookie和自己的逻辑都没问题 , 原来是因为我保存了密码 , 浏览器保存后自动渲…

【Python】解决Python报错:ModuleNotFoundError: No module named ‘xxx.yyy‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

企业如何进行快递运费对账?

在电子面单寄件取代手写纸质面单之后&#xff0c;加上月结寄件模式的推行&#xff0c;企业快递运费对账&#xff0c;成了行政的一个难题...... 早期的手写纸质面单寄件&#xff0c;企业行政或者财务相关人员&#xff0c;遵循寄前审批&#xff0c;寄后报销的原则进行对账。随着电…

WebGoat靶场搭建

WebGoat靶场介绍 WebGoat是一个由OWASP&#xff08;Open Web Application Security Project&#xff09;组织开发的应用平台&#xff0c;专门用于进行Web应用程序安全漏洞的实验。它旨在通过模拟各种安全漏洞&#xff0c;帮助用户了解和学习如何识别和防御这些漏洞。WebGoat基…

Python导出Jira列表

import requests import urllib3 urllib3.disable_warnings() from jira import JIRA import pandas as pd def login_jira(username,password):jira JIRA("https://jira.cn/",basic_auth(username,password))#projectsjira.project(id13)# jqlproject"云链-…

跨境电商如何有效做好店铺账号管理?

跨境电商有效做好店铺账号管理至关重要&#xff0c;类似亚马逊、Temu、TikTok、ebay跨境电商账号涉及多个方面&#xff0c;包括多个账户的安全性、合规性、操作效率等。以下是一些我自己实操的策略和实践&#xff0c;希望能够帮助大家更好地管理跨境电商店铺账号。 一、哪些行为…

CISCN 2022 初赛 ez_usb

还是从第一个 URB向后看 发现 同时 存在 2.8.1 2.10.1 2.4.1 但是显然 2.4.1 是7个字节 不满足 usb流量要求 只考虑 2.8.1 和 2.10.1 tshark -r ez_usb.pcapng -T json -Y "usb.src \"2.8.1\"" -e usbhid.data > 281.json 正常取数据即可 import js…