背包问题

01背包

Given

  1. n种物品,每种物品只有1个
  2. 每个物品有自己的重量、价值。
  3. 背包最大能装载的重量

动规五部曲——用二维数组

  1. 定义dp数组的含义:dp[ i ][ j ]表示[0,i]物品,任取放在容量为j的背包。
  2. 递推数组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])
  3. 如何初始化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数组降为一维——滚动数组

  1. 定义dp[j]表示容量为j的背包能放最大价值为dp[j]的物品
  2. 递推数组:
    滚动数组的每一次更新,比如第i次更新,就是表示对于物品i的决策。相当于在二维数组中,把下一行的值直接在本行进行更新,所以先前的dp[j]是存储了不放物品i的
    dp[j]=max(dp[j],dp[j-weight[i]]+value[i])
  3. 初始化:
    dp[0]=0
    因为dp[j]是在自己原来的值和另外一个值取max,所以自己的初始化不能太大,不然会覆盖真实的情况。
    所以其余全部可以初始化为0
  4. 遍历顺序
    先遍历物品->再倒叙遍历背包(倒叙保证物品只被添加一次)

416. 分割等和子集

题目

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

怎么靠到动态规划01背包问题

  1. 一开始我的笨蛋想法是从大到小遍历整个数组中的元素,用两个数组来装。对于元素i,如果当前数组sum1>sum2,就放到2,否则放到1中,但是这是错误的。对于【5,4,3,3,3】。
  2. 靠向背包问题:切割为和相等的两个数组。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. 分割等和子集相关推荐

  1. 承认吧,你就是个意志力很差的人

    你是不是会因为控制不住自己的口舌之欲,而垂足顿胸.控制不住自己打游戏,刷短剧抖音,看电视剧,而浪费时间. 你说自己就玩一会儿,逆葛优躺在沙发上,几分钟过去了,几个小时过去了,这一天过去了. 你感觉这一 ...

  2. 当年学生的一件事,心情很难过

    当年学生的一件事,心情很难过 今天同一个以前的学生聊天,搞得心情很难过.         那年是刚毕业,带了几个学生的毕业论文,其中有一个,只是第一次见过一面,最后答辩前见一两天以及答谢见过一面.他从 ...

  3. 某快手程序员爆料:给小厂随便投投简历,面试表现很差也能过,大厂背书确实有用!...

    "背书"有保证.担保的意思,"大厂背书"意即有大厂工作背景做担保,在大厂工作过的人,会给人一种技术好.能力强的感觉,人们往往觉得在大厂待过的人不会太差. 那么在 ...

  4. 英语很差,可能不会阻止你成为一名程序员,但一定会限制你成为一名“优秀的”程序员...

    作者 l 会点代码的大叔(CodeDaShu) 我在很多平台上发表技术类的文章,收到过很多朋友的私信,问一些技术类和程序员职业发展类的问题,常见的问题比如"我已经 XX 岁了,想转行做程序员 ...

  5. c语言怎么编程极差,我是一个编程能力很差的计算机专业的孩子。。==

    好无语,高考后没怎么思考就报了志愿,录取后知道是软件工程专业,想想学计算机啊,会挺好玩儿的吧,就带着录取通知书屁颠屁颠开始了大学生活. 但是真正到了大学才知道,我这专业要求编程能力要很强啊啊啊!!!从 ...

  6. 神经网络测试结果很差,该怎么做

    神经网络测试结果很差,该怎么做 当我们编程实现了神经网络模型,将模型用于测试集时,经常会发现测试的准确率非常的低,神经网络层数很深,通常我们不容易判断具体的梯度下降求解参数的过程,那我们该怎么办呢?从 ...

  7. 高中理科不好学计算机,高一理科很差但想学理咋办

    高一理科很差但想学理咋办2020-12-01 17:30:09文/叶丹 有的同学觉得自己高一理科成绩太差,但是又想学理科,所以就在犹豫不决,不知道该怎么办?高中物理好难啊,简直太难了,但如果你一直都是 ...

  8. 今天很悲剧,心情很郁闷

    下午数字逻辑听都听不懂,两节课都在睡觉中度过.回机房写完最后一个标程又趴下了,晚上的选修课也昏昏沉沉的.心情很压抑,很想睡觉.院赛搞的烦了:又想到伤心事了:网页还没做好:数字逻辑作业还没写好:还要看m ...

  9. 数学不好学计算机有影响吗,数学很差能学计算机吗

    上大学选专业是一件非常重要的事情,现在,计算机是非常热门的专业,很多学生都会投身到计算机领域的学习中,为的就是在以后能够找到一个与计算机有关的工作,但是很多人认为想要学好计算机就需要有好的数学基础,那 ...

最新文章

  1. python调用dll报错:ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong call
  2. 查看 并发请求数及其TCP连接状态
  3. VS2015快捷键使用学习总结
  4. PHP算法向数组的头插入带键的元素
  5. HBase常用的Shell命令
  6. Embeded linux之移植iptables
  7. 怎么把线稿提取出来_如何快速提取漫画线稿?【漫画技巧】
  8. 监听页面滚动触发事件,页面停止滚动触发事件
  9. Linux uname 命令 打印系统信息
  10. 安卓开发——锁定软件——输入密码后重复弹出输入密码窗口的解决方法
  11. 是什么造就了伟大的程序员?
  12. 交流信号叠加直流偏置_接收无线电信号利器,一款无线有源环形收音机接收天线放大器...
  13. 找礼物(find)(模拟)
  14. Linux20180502 六周第四次课(5月2日)
  15. mysql集群 自增_为什么我们要从MySQL迁移到TiDB?
  16. 单片机原理及其应用试题(含答案)
  17. 如何压缩jpg图片的大小?
  18. 青年必读书——民国名流开具的书单
  19. Linux 进程通信(System V)消息队列
  20. 汤姆熊游艺厅抓娃娃技巧汇总

热门文章

  1. 正则表达式之贪婪匹配和懒惰匹配
  2. 269 t101 对称二叉树
  3. SEO可以分为5个层次
  4. 最新发布 Debian 系统的详细安装过程
  5. 通过ip地址访问操作远程Mysql数据库
  6. Unity IOS游戏内好评
  7. 从概念到底层技术,区块链一站式分析和汇总(附知识图谱)
  8. IEEE论文格式要求
  9. 锁定单个或多个单元格与解锁方法
  10. 一个好用的在线画图工具 - 图表秀