Suzy心情很差因为被charge了late fee Day42 | 动态规划之背包问题,416. 分割等和子集
背包问题
01背包
Given
- n种物品,每种物品只有1个
- 每个物品有自己的重量、价值。
- 背包最大能装载的重量
动规五部曲——用二维数组
- 定义dp数组的含义:dp[ i ][ j ]表示[0,i]物品,任取放在容量为j的背包。
- 递推数组dp[i][j]:
(1)不放物品i,则所选的物品少1:dp[i-1][j]
(2)放物品i,则背包容量需要减去i的重量:dp[i-1][j-weight[i]]+value[i]
(3)dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]) - 如何初始化dp数组:dp[i][j]是由上面的dp[i-1][j]和左上方的某一个元素推至。所以需要初始化第一行和第一列,然后按照递推公式确定后续的所有。
(1)第一列初始化:dp[k][0]=0, k=0,…,n-1
(2)第一行初始化:dp[0][k]按照物品0的重量决定
(3)其余任意
动规五部曲——用一维数组
链接: 01背包问题用一维数组
把二维dp数组降为一维——滚动数组
- 定义dp[j]表示容量为j的背包能放最大价值为dp[j]的物品
- 递推数组:
滚动数组的每一次更新,比如第i次更新,就是表示对于物品i的决策。相当于在二维数组中,把下一行的值直接在本行进行更新,所以先前的dp[j]是存储了不放物品i的
dp[j]=max(dp[j],dp[j-weight[i]]+value[i]) - 初始化:
dp[0]=0
因为dp[j]是在自己原来的值和另外一个值取max,所以自己的初始化不能太大,不然会覆盖真实的情况。
所以其余全部可以初始化为0 - 遍历顺序
先遍历物品->再倒叙遍历背包(倒叙保证物品只被添加一次)
416. 分割等和子集
题目
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
怎么靠到动态规划01背包问题
- 一开始我的笨蛋想法是从大到小遍历整个数组中的元素,用两个数组来装。对于元素i,如果当前数组sum1>sum2,就放到2,否则放到1中,但是这是错误的。对于【5,4,3,3,3】。
- 靠向背包问题:切割为和相等的两个数组。nums总和为sum时,即有一个背包容量为sum/2的背包,nums数组是物品的重量,找到把背包装满的物品。
solution(二维)
class Solution:def canPartition(self, nums: List[int]) -> bool:if sum(nums)%2==1:return Falsepackage=int(sum(nums)/2) # 背包容量11temp=[0]*(package+1) dp=[]for i in range(len(nums)):dp.append(temp.copy())# dp[i][j]=max(dp[i-1][j]],dp[i-1][j-nums[i]]+nums[i])# if dp[i][package]==package:return True# if traversal items finished, return Falsefor i in range(len(nums)):dp[i][0]=0for j in range(len(dp[0])):if j>=nums[0]:dp[0][j]+=nums[0]for i in range(len(nums)):for j in range(len(dp[0])):# 我们的目的是尽可能地装满我们的背包容量,即最多的价值的物品# 如果dp[-1][package]==package,说明我们决策完所有的物品后,能装到的最大价值(重量)如果与背包容量相等,则说明可以分割数组。否则不满足。if j>=nums[i]:dp[i][j]=max(dp[i-1][j],dp[i-1][j-nums[i]]+nums[i])else:dp[i][j]=dp[i-1][j]if dp[-1][-1]==package:return Truereturn False
递推公式处需要进行判断,当前的容量是否可以装,可以装才有递推公式(选到底装还是不装),不可以装就只有一种情况。
Suzy心情很差因为被charge了late fee Day42 | 动态规划之背包问题,416. 分割等和子集相关推荐
- 承认吧,你就是个意志力很差的人
你是不是会因为控制不住自己的口舌之欲,而垂足顿胸.控制不住自己打游戏,刷短剧抖音,看电视剧,而浪费时间. 你说自己就玩一会儿,逆葛优躺在沙发上,几分钟过去了,几个小时过去了,这一天过去了. 你感觉这一 ...
- 当年学生的一件事,心情很难过
当年学生的一件事,心情很难过 今天同一个以前的学生聊天,搞得心情很难过. 那年是刚毕业,带了几个学生的毕业论文,其中有一个,只是第一次见过一面,最后答辩前见一两天以及答谢见过一面.他从 ...
- 某快手程序员爆料:给小厂随便投投简历,面试表现很差也能过,大厂背书确实有用!...
"背书"有保证.担保的意思,"大厂背书"意即有大厂工作背景做担保,在大厂工作过的人,会给人一种技术好.能力强的感觉,人们往往觉得在大厂待过的人不会太差. 那么在 ...
- 英语很差,可能不会阻止你成为一名程序员,但一定会限制你成为一名“优秀的”程序员...
作者 l 会点代码的大叔(CodeDaShu) 我在很多平台上发表技术类的文章,收到过很多朋友的私信,问一些技术类和程序员职业发展类的问题,常见的问题比如"我已经 XX 岁了,想转行做程序员 ...
- c语言怎么编程极差,我是一个编程能力很差的计算机专业的孩子。。==
好无语,高考后没怎么思考就报了志愿,录取后知道是软件工程专业,想想学计算机啊,会挺好玩儿的吧,就带着录取通知书屁颠屁颠开始了大学生活. 但是真正到了大学才知道,我这专业要求编程能力要很强啊啊啊!!!从 ...
- 神经网络测试结果很差,该怎么做
神经网络测试结果很差,该怎么做 当我们编程实现了神经网络模型,将模型用于测试集时,经常会发现测试的准确率非常的低,神经网络层数很深,通常我们不容易判断具体的梯度下降求解参数的过程,那我们该怎么办呢?从 ...
- 高中理科不好学计算机,高一理科很差但想学理咋办
高一理科很差但想学理咋办2020-12-01 17:30:09文/叶丹 有的同学觉得自己高一理科成绩太差,但是又想学理科,所以就在犹豫不决,不知道该怎么办?高中物理好难啊,简直太难了,但如果你一直都是 ...
- 今天很悲剧,心情很郁闷
下午数字逻辑听都听不懂,两节课都在睡觉中度过.回机房写完最后一个标程又趴下了,晚上的选修课也昏昏沉沉的.心情很压抑,很想睡觉.院赛搞的烦了:又想到伤心事了:网页还没做好:数字逻辑作业还没写好:还要看m ...
- 数学不好学计算机有影响吗,数学很差能学计算机吗
上大学选专业是一件非常重要的事情,现在,计算机是非常热门的专业,很多学生都会投身到计算机领域的学习中,为的就是在以后能够找到一个与计算机有关的工作,但是很多人认为想要学好计算机就需要有好的数学基础,那 ...
最新文章
- python调用dll报错:ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong call
- 查看 并发请求数及其TCP连接状态
- VS2015快捷键使用学习总结
- PHP算法向数组的头插入带键的元素
- HBase常用的Shell命令
- Embeded linux之移植iptables
- 怎么把线稿提取出来_如何快速提取漫画线稿?【漫画技巧】
- 监听页面滚动触发事件,页面停止滚动触发事件
- Linux uname 命令 打印系统信息
- 安卓开发——锁定软件——输入密码后重复弹出输入密码窗口的解决方法
- 是什么造就了伟大的程序员?
- 交流信号叠加直流偏置_接收无线电信号利器,一款无线有源环形收音机接收天线放大器...
- 找礼物(find)(模拟)
- Linux20180502 六周第四次课(5月2日)
- mysql集群 自增_为什么我们要从MySQL迁移到TiDB?
- 单片机原理及其应用试题(含答案)
- 如何压缩jpg图片的大小?
- 青年必读书——民国名流开具的书单
- Linux 进程通信(System V)消息队列
- 汤姆熊游艺厅抓娃娃技巧汇总