文章目录

  • 01背包基础 (二维数组)
    • 思路
      • 递推公式
      • 初始化
      • 遍历顺序
  • 一维dp数组(滚动数组)
    • 一维数组的递推公式
    • 遍历顺序
  • LeetCode 416. 分割等和子集
    • 思路
  • 总结

01背包基础 (二维数组)

思路

根据动态规划五部进行分析,先进行参数和下标的初始化
由于是背包探索我们用二维数组 创建一个 dp[i][j] i是指第几个书包,j是指背包最多能容下的体积
然后确定递推公式

递推公式

这道题递推公式的展开从两个方面 一个是尺寸比书包小可以放进去 一个是尺寸比书包放不进去

  • 不放物品i:
    dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以被背包内的价值依然和前面相同。)
  • 放物品i
    dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值
    所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

初始化

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。

// 正序遍历
for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];
}

遍历顺序

在二维数组中无论是先遍历物品 后遍历背包 或者 先遍历背包后遍历物品都能够达成目的
不过在后序的一维数组中完成背包问题就固定下来了, 先遍历物品后遍历书包。

一维dp数组(滚动数组)

在使用二维数组的时候,递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

其实可以发现如果把dp[i - 1]那一层拷贝到dp[i]上,表达式完全可以是:

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

与其把dp[i - 1]这一层拷贝到dp[i]上,不如只用一个一维数组了,只用dp[j](一维数组,也可以理解是一个滚动数组)。

一维数组的递推公式

dp[j]可以通过dp[j - weight[i]]推导出来,dp[j - weight[i]]表示容量为j -
weight[i]的背包所背的最大价值。

dp[j - weight[i]] + value[i] 表示 容量为 j - 物品i重量 的背包 加上
物品i的价值。(也就是容量为j的背包,放入物品i了之后的价值即:dp[j])

此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j -
weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值,

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

遍历顺序

与二维数组不同, 先物品再背包, 背包遍历要求 倒序遍历因为这样就可以保证每一个物品只放一次

for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}

LeetCode 416. 分割等和子集

思路

这里运用了 01背包的思路 ,我的做法是采用了一维数组的方式做的

class Solution {public boolean canPartition(int[] nums) {if(nums==null|| nums.length==0) return false;int n=nums.length;int sum=0;for(int num: nums){  sum+= num;}if( sum%2!=0) return false;int target= sum/2;int dp[]= new int [target+1];for( int i=0;i<n;i++){for( int j=target;j>= nums[i];j--){dp[j]= Math.max( dp[j],dp[j-nums[i]]+nums[i]);}}return dp[target] == target;}
}

总结

恢复更新了,之前在返校,临开学也没有状态就休息了一段时间

代码随想录算法训练营第45天动态规划 背包基础 1 2、 416. 分割等和子集相关推荐

  1. _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

    _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机.122.买卖股票的最佳时机II 题目列表 121.买卖股票的最佳时机 122.买卖股票的最佳时机II 1 ...

  2. 代码随想录算法训练营第46天 | 动态规划 part08 ● 139.单词拆分 ● 关于多重背包 ● 背包问题总结篇

    #139 单词拆分 没做出来.我原来是把string放到dp里,不对,这种做法永远都不对.他问的是什么(能不能构成,true,false)就要放到dp里 (大部分题是这样)下面是不对的思路: 正确co ...

  3. 代码随想录算法训练营第42天 | 动态规划 part04 ● 背包问题二维● 背包问题滚动数组 一维 ● 416. 分割等和子集

    # 二维dp数组,01背包 1.确定dp数组以及下标的含义 dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少. 2.  gpt 解决我的困惑 3.  另外 ...

  4. 代码随想录算法训练营第四十二天-动态规划4|● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    今天只有1道题,属于动态规划的01背包问题的应用.首先理解一下动态规划的01背包问题.推荐一个视频,动态规划DP0-1背包,这是我认为讲得最为通透的.很多讲解动态背包问题的,一上来就画二维表格,遍历背 ...

  5. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

  6. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  7. 代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独

    代码随想录算法训练营第30天| 332.重新安排行程 .51. N皇后 . 37. 解数独 332.重新安排行程 开始想的是将行程进行全排列之后,然后选出一个字典排序最小的.就也是使用的回溯的思路. ...

  8. 代码随想录算法训练营day42 | 01背包问题,你该了解这些!,01背包问题,你该了解这些! 滚动数组 , 416. 分割等和子集

    代码随想录算法训练营day42 | 背包理论基础,背包理论基础(滚动数组), 416. 分割等和子集 1.01背包理论基础 背包问题概述 01背包 二维dp数组01背包案例 2.01背包理论基础(滚动 ...

  9. 代码随想录算法训练营day1

    代码随想录算法训练营第一天| 704. 二分查找.27. 移除元素. 704.二分查找 题目链接:leetcode704 Binary search 暴力解法: class Solution {pub ...

最新文章

  1. LambdaMART的思想
  2. 化工热力学重修补考第二章重点内容
  3. 关于 AfxSocketInit() 的使用
  4. Jython 2.2 发布
  5. 最简单的NamedPiep程序[秋镇菜]-初学者看看
  6. android 汽车 源码_汽车级Linux,无需Google即可运行Android等
  7. vb 复制 剪贴板 html,VB把选中的内容复制到剪切板
  8. 321. 拼接最大数
  9. hdu 4155 回溯
  10. 拓端tecdat|R语言对HullWhite短期利率模型仿真
  11. Linux-I/O重定向和管道
  12. Bootstrap入门!
  13. C++中回调(CallBack)的使用方法
  14. ibm刀片机服务器安装系统,IBM刀片服务器安装.doc
  15. 最强GTD时间管理工具:OmniFocus Pro 3 for Mac支持big sur
  16. python类型数值操作
  17. 大数据基准测试平台BigDataBench5.0安装配置及使用
  18. 系统入门到实战学习某项技术、有问题找“百度“、学习优秀的技术博客、找开源代码等资料
  19. .net Windows服务开发
  20. 我从谷歌趋势找出疫情中16种火爆的商品 - 2020选品思路

热门文章

  1. 电脑微信聊天记录转移到另一台电脑
  2. SDK和API的区别是什么?
  3. 必要的了解中国魔术历史
  4. Day814.电商系统表设计优化案例分析 -Java 性能调优实战
  5. linux 中多进程下载工具,[转载]Linux 下安装多线程下载工具 proz
  6. windowBuilder Pro下载
  7. 搬砖工php什么意思,我要去搬砖了是什么意思什么梗? 搬砖的几种含义了解一下...
  8. 如何提升GPU利用率 在使用fit_generator时
  9. 敏捷,文档,人才,文化——谈小公司研发管理
  10. c语言程序设计用指纹解锁门,基于指纹识别技术的校园门禁应用