算法训练Day41|416. 分割等和子集

背包问题:

LeetCode:416. 分割等和子集

416. 分割等和子集 - 力扣(LeetCode)

1.思路

①确定dp[]数组的含义,dp[i]:表示重量为 i 的背包所能装下的最大价值.

②确定递推公式,倒叙加入.

③初始化,默认为0即可.

④确认遍历顺序,先遍历物品,再遍历背包,背包从大到小遍历.

⑤举例代入,打印dp[]数组.

2.代码实现

复制代码
 1class Solution {
 2    public boolean canPartition(int[] nums) {
 3        int sum = 0;
 4        for (int num : nums) {
 5            sum += num;
 6        }
 7        if (sum % 2 != 0) {
 8            return false;
 9        }
10        int target = sum / 2;
11        // target 代表重量和价值 则dp[] 数组要达到target,需要创建数组范围为:[0, target]
12        int[] dp = new int[target + 1];
13        for (int i = 0; i < nums.length; i++) { // 先遍历物品
14            for (int j = target; j >= nums[i]; j--) {
15                // 再遍历背包
16                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
17            }
18        }
19        return dp[target] == target;
20    }
21}

3.复杂度分析

时间复杂度:O(n^2).

空间复杂度:O(n).

相关推荐
wangwangmoon_light7 分钟前
1.1 LeetCode总结(线性表)_枚举技巧
算法·leetcode·哈希算法
一嘴一个橘子18 分钟前
spring-aop 的 基础使用 - 4 - 环绕通知 @Around
java
小毅&Nora35 分钟前
【Java线程安全实战】⑨ CompletableFuture的高级用法:从基础到高阶,结合虚拟线程
java·线程安全·虚拟线程
码农小韩35 分钟前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习
冰冰菜的扣jio35 分钟前
Redis缓存中三大问题——穿透、击穿、雪崩
java·redis·缓存
mit6.82441 分钟前
几何|阻碍链
算法
有一个好名字43 分钟前
力扣-小行星碰撞
算法·leetcode·职场和发展
MM_MS43 分钟前
Halcon图像锐化和图像增强、窗口的相关算子
大数据·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
小璐猪头1 小时前
专为 Spring Boot 设计的 Elasticsearch 日志收集 Starter
java
lamentropetion1 小时前
E - Equal Tree Sums CF1656E
算法