当前位置: 首页 > wzjs >正文

中国培训网旧版优化大师

中国培训网,旧版优化大师,生物科技企业网站做的比较好的,html 做网站案例简单题目解析 题目:给定一个正整数数组 nums,判断是否可以将数组分成两个和相等的子集。 等价问题: • 计算 nums 的总和 S • 如果 S 是奇数,直接返回 false(因为不能均分) • 目标是找到一个子集&#xff…

题目解析

题目:给定一个正整数数组 nums,判断是否可以将数组分成两个和相等的子集。

等价问题

• 计算 nums 的总和 S

• 如果 S 是奇数,直接返回 false(因为不能均分)

• 目标是找到一个子集,使得子集和等于 S / 2

• 这相当于 0-1 背包问题:是否能从 nums 中选取一些数,使其和为 S / 2

解法:动态规划

1. 状态定义

使用 一维 DP 数组 dp[j]:

• dp[j] = true 表示存在一个子集,使得该子集的和为 j

• dp[j] = false 表示不存在这样的子集

目标:判断 dp[target] 是否为 true,其中 target = S / 2

2. 递推公式

• 遍历数组 nums,对于当前元素 num

倒序遍历 j = target 到 num,更新 dp[j]

• dp[j] = dp[j] || dp[j - num]

如果 dp[j - num] 为 true,说明 j - num 可达,那么 j 也可达

如果 dp[j] 原本为 true,则仍为 true

3. 初始化

• dp[0] = true(空集的和为 0)

代码分析

class Solution {
public:bool canPartition(vector<int>& nums) {int s = accumulate(nums.begin(), nums.end(), 0); // 计算总和if (s % 2 != 0) return false; // 总和为奇数,无法均分int target = s / 2; // 目标和vector<bool> dp(target + 1, false); // DP 数组,表示是否能组成某个和dp[0] = true; // 0 直接可达for (int num : nums) { // 遍历每个数for (int j = target; j >= num; j--) { // 逆序遍历dp[j] = dp[j] || dp[j - num];}}return dp[target]; // 看 target 是否可达}
};

详细运行步骤

示例 1

输入

nums = {1, 5, 11, 5}

计算总和

• S = 1 + 5 + 11 + 5 = 22

• target = 22 / 2 = 11

• 需要找到一个子集和为 11

DP 过程

初始化:

dp = [true, false, false, false, false, false, false, false, false, false, false, false]

(下标 0 代表和为 0 可达)

遍历 1

dp[1] = dp[1] || dp[1 - 1]  (true)

dp = [true, true, false, false, false, false, false, false, false, false, false, false]

遍历 5

dp[6] = dp[6] || dp[6 - 5] (true)
dp[5] = dp[5] || dp[5 - 5] (true)

dp = [true, true, false, false, false, true, true, false, false, false, false, false]

遍历 11

dp[11] = dp[11] || dp[11 - 11] (true)

dp = [true, true, false, false, false, true, true, false, false, false, false, true]

最终 dp[11] = true,返回 true

案例分析

我们用一个不同的测试案例,详细跟踪 dp 数组的变化。

示例 2

输入

nums = {3, 3, 3, 4, 5}

计算总和

• S = 3 + 3 + 3 + 4 + 5 = 18

• target = 18 / 2 = 9

• 目标是找到一个子集,使得该子集的和为 9

初始化

我们初始化 dp 数组:

dp = [true, false, false, false, false, false, false, false, false, false]

• dp[0] = true,表示和为 0 的子集是可行的(空集)

遍历每个数

遍历 3(第一个)

更新 dp[j],从 target = 9 逆序到 num = 3

dp[3] = dp[3] || dp[3 - 3] = true

dp 变化

dp = [true, false, false, true, false, false, false, false, false, false]

表示可以用 {3} 得到和 3

遍历 3(第二个)

dp[6] = dp[6] || dp[6 - 3] = true
dp[3] = dp[3] || dp[3 - 3] = true (已经是 true)

dp 变化

dp = [true, false, false, true, false, false, true, false, false, false]

表示可以用 {3, 3} 得到和 6

遍历 3(第三个)

dp[9] = dp[9] || dp[9 - 3] = true
dp[6] = dp[6] || dp[6 - 3] = true (已经是 true)
dp[3] = dp[3] || dp[3 - 3] = true (已经是 true)

dp 变化

dp = [true, false, false, true, false, false, true, false, false, true]

表示可以用 {3, 3, 3} 得到和 9 ✅ 目标达成

遍历 4

dp[9] = dp[9] || dp[9 - 4] = true (已经是 true)
dp[7] = dp[7] || dp[7 - 4] = true
dp[4] = dp[4] || dp[4 - 4] = true

dp 变化

dp = [true, false, false, true, true, false, true, true, false, true]

表示可以用 {4} 得到和 4,可以用 {3, 4} 得到 7

遍历 5

dp[9] = dp[9] || dp[9 - 5] = true
dp[8] = dp[8] || dp[8 - 5] = true
dp[5] = dp[5] || dp[5 - 5] = true

dp 变化

dp = [true, false, false, true, true, true, true, true, true, true]

可以用 {5} 得到 5,用 {3, 5} 得到 8

最终结果

✅ dp[9] = true,说明可以找到一个子集使得总和为 9,返回 true

完整执行过程

dp 状态

0

1

2

3

4

5

6

7

8

9

初始

T

F

F

F

F

F

F

F

F

F

处理 3

T

F

F

T

F

F

F

F

F

F

处理 3

T

F

F

T

F

F

T

F

F

F

处理 3

T

F

F

T

F

F

T

F

F

T

处理 4

T

F

F

T

T

F

T

T

F

T

处理 5

T

F

F

T

T

T

T

T

T

T

dp[9] = true,所以可以划分两个子集和相等。

复杂度分析

时间复杂度:O(n × target) 其中 target = S/2

空间复杂度:O(target) 只用了一维 dp

总结

思路

1. 计算 S,如果 S 为奇数直接返回 false

2. 定义 dp[j]:表示能否找到一个子集,使得总和为 j

3. 遍历 nums,使用 逆序 更新 dp,确保不会重复使用数字

4. 最终 dp[target] 是否为 true,决定是否能划分

关键优化点

• 使用 一维 DP 数组(空间优化)

倒序遍历 j,避免同一轮重复使用 nums[i]

时间复杂度

• O(n × sum/2),适用于 sum 适中的情况(sum < 10^5)

空间复杂度

• O(sum/2),降低空间占用

http://www.dtcms.com/wzjs/370367.html

相关文章:

  • 手机网站开发技巧seo课程简介
  • 零起飞网站建设工作室抖音网络营销案例分析
  • 鄂尔多斯市建设网站百度推广公司哪家比较靠谱
  • 中央新闻联播湖南正规seo优化报价
  • 阜阳网站建设哪家好客户引流推广方案
  • 建设银行 网站查询密码小红书推广引流软件
  • 陕西机械加工网seo建站优化推广
  • 淘宝京东拼多多购物券网站怎么做朝阳网站建设
  • 网站必须做百度推广才能被别人搜到吗自动引流免费app
  • wordpress修改url无法打开莱阳seo排名
  • 商务网站创建设计方案站长工具网站推广
  • php的网站怎么做站长工具名称查网站
  • 网站建设企业建站模板关键词全网搜索工具
  • 为什么中国人都跑去泰国做网站赌博企业建站平台
  • 给博彩网站做推广犯法优化百度搜索
  • 建网站学什么seo项目优化案例分析文档
  • 网上建设银行网站首页运营推广计划
  • wordpress 主题 强大河北seo推广方案
  • 如皋市建设局网站在哪里互动营销成功案例
  • 重庆网站建设有限公司网络推广员每天的工作是什么
  • 建设网站的公司今天最火的新闻头条
  • 江苏常州网站建设品牌运营管理公司
  • 领动做的企业网站怎么样百度导航下载2020新版语音
  • 招商网站怎么做南京企业网站排名优化
  • 做网站太累网络销售平台有哪些
  • 做帖子的网站有哪些网络营销的发展概述
  • wordpress 学校模板太原网站制作优化seo
  • 做网站的知识线上推广费用预算
  • 做漫画视频在线观看网站株洲seo优化
  • 营销型网站开发营销seo网站优化课程