| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 0-1背包问题 力扣416 分割等和子集 java实现 -> 正文阅读 |
|
[数据结构与算法]0-1背包问题 力扣416 分割等和子集 java实现 |
目录 问题描述给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums = [1,5,11,5] 输入:nums = [1,2,3,5] 提示: 1 <= nums.length <= 200 要素提取两个子集的元素和相等。两个子集的元素和相等,那么整个数组元素的和一定是一个偶数。两个相等的偶数相加或者两个相等的奇数相加一定都是一个偶数。 子集的元素和在一个集合中找到若干个数,使它的和恰好为某个值,每个元素都只能被使用一次。这是一个0-1背包问题。 难点突破(0-1背包在本题中的应用)本题思路0-1背包的特点是【每个数只能用一次】。解决的基本思路是【物品一个一个去选,容量也一点点去加】在加的过程中考虑保留或是丢弃这个物品。 本题初始化一个nums.length行,target + 1列的二维数组。len行表示物品的数量,target + 1列表示背包的容量。容量要 +1 是因为背包问题一般需要初始条件,本题的初始条件也就是当背包容量为0时,能装的物品数量也是0【没有物品能够装进去】。 状态定义与状态转移方程状态定义:dp[i][j] 表示从数组[0,i]中挑选一些数字,使得这些数字的和恰好为 j。 状态转移方程:若物品容量等于当前容量那么一定是true。 选择不装第 i 个物品,如果选择在[0,i-1]这个子区间区间内已经有元素和等于 j 那么为true。 选择装第 i 个物品,在[0,i-1]这个子区间内有元素的和为 j-nums[i] 那么为true 注意事项:确保数组下标不能越界。i-1 要 大于等于 0 ,j-nums[i] 要大于等于0 当容量为 0 时,没有物品能装进去所以第一列全部为 false。 ? 代码实现
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 1:33:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |