| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> LeetCode刷题day54 -> 正文阅读 |
|
[数据结构与算法]LeetCode刷题day54 |
416. 分割等和子集题目描述给你一个 只包含正整数 的 非空 数组 示例 1:
示例 2:
思路分析本题要求集合里能否出现总和为 sum / 2 的子集。 只有确定了如下四点,才能把01背包问题套到本题上来。
动规五部曲
01背包中,dp[j]表示:容量为j的背包,所背的物品最大价值为dp[j]. 回到本题,dp[j]表示:背包总容量为j,最大可以凑成j的子集总和为dp[j]
本题中,背包中放入数值,那么物品i的重量是nums[i],其价值也是nums[i] 所以递归公式: 3.dp数组如何初始化 当背包容量为0时,放入数值的总和为0,所以
根据卡尔大佬的 动态规划:关于01背包问题,你该了解这些!(滚动数组) 的讲解,如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历.
参考代码
1049. 最后一块石头的重量 II题目描述有一堆石头,用整数数组 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 示例 1:
示例 2:
示例 3:
思路分析本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 这就和上面的 416. 分割等和子集 (opens new window) 非常像了。 动归五部曲
dp[j]表示容量为j的背包,最多可以背dp[j]这么重的石头
本题和上题类似,上题是子集一半,本题是一半石头. 递推公式:
提示中给出1 <= stones.length <= 30,1 <= stones[i] <= 1000,所以最大重量就是30 * 1000 。 而我们要求的target其实只是最大重量的一半,所以dp数组开到15000+1大小就可以了。 然后是dp初始化,因为重量都是 > 0,所以
根据卡尔大佬的 动态规划:关于01背包问题,你该了解这些!(滚动数组) 的讲解,如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历.
以两个例子演示dp数组的推导过程,如下: 参考代码
如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 11:28:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |