news 2026/6/10 13:08:38

【动态规划】力扣494.目标和:一文学会「转化思想」与「01背包应用」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【动态规划】力扣494.目标和:一文学会「转化思想」与「01背包应用」

问题重述

给定非负整数数组nums和目标值target,在每个数字前添加+-,使表达式结果等于target,求不同表达式的数量。

题目链接:494. 目标和 - 力扣(LeetCode)

潜在关系

设:

  • left:所有添加+的数字之和(正数集合)

  • right:所有添加-的数字之和(负数集合的绝对值)

  • 数组总和为sum

根据题意:

left+right=sum

left-right=target

得到:

left= (sum + target) //2

问题转化

从 nums 中选出若干个数,使它们的和恰好等于 pos,求有多少种选法

约束条件

  1. (sum + target)必须为偶数(因为 pos 必须是整数)

  2. left 必须 ≥ 0(不能选负数个数字)

  3. sum ≥ abs(target)(否则不可能达到目标)


动态规划解法详解

1. 转化为01背包问题

  • 背包容量:left= (sum + target) / 2

  • 物品:数组中的每个数字(重量 = 数值)

  • 价值:这里不是求最大价值,而是求方法数(计数型背包)

  • 问题:装满背包有多少种方法?

2. DP数组定义

dp[j]表示:装满容量为 j 的背包,有 dp[j] 种方法

3. 初始化

dp[0] = 1

装满容量0的背包有一种方法:什么都不选(空集)

4. 状态转移方程

dp[j] = dp[j] + dp[j - nums[i]]
公式拆解理解:

对于当前数字nums[i],要装满容量j

  1. 不选当前数字:方法数 = 原来的dp[j]

    • 保持之前已经有的方法数

  2. 选当前数字:方法数 =dp[j - nums[i]]

    • 前提:j ≥ nums[i](背包容量要装得下这个数字)

    • 含义:如果选了当前数字(重量为nums[i]),那么剩下的容量j - nums[i]需要被装满

    • dp[j - nums[i]]就是装满剩下容量的方法数

  3. 总方法数= 不选的方法数 + 选的方法数

    • 这就是组合计数的加法原理

5. 遍历顺序

必须从后往前遍历背包容量

python

for j in range(left, nums[i] - 1, -1): # 从大到小 dp[j] += dp[j - nums[i]]
为什么不能从前往后?

假设nums = [1, 1], left= 2

  • 如果从前往后:

    • 处理第一个1:dp[1] = 1,dp[2] = 1

    • 处理第二个1时,dp[2] = dp[2] + dp[1] = 1 + 1 = 2

    • 这相当于[1, 1]被用了两次(重复计算)

  • 从后往前:

    • 保证计算dp[j]时,dp[j - nums[i]]上一轮的状态

    • 避免同一物品被多次使用


完整代码实现

class Solution: def findTargetSumWays(self, nums: List[int], target: int) -> int: summ=sum(nums) if (summ+target)%2==1 or summ<abs(target): return 0 #不能整除,说明有小数 left=(summ+target)//2 dp=[0]*(left+1) #dp[j]:装满容量为j的背包有dp[j]种方法 if left<0: return 0 dp[0]=1 for i in range(len(nums)): for j in range(left,nums[i]-1,-1): dp[j]=dp[j]+dp[j-nums[i]] # dp[j]:不选当前数字,保持原来方法数 # dp[j-nums[i]]:选当前数字,那么当前方法取决于j-nums[i]的方法数 return dp[left]


易错点总结

  1. 边界条件

    • sum < abs(target)时直接返回0

    • (sum + target)必须是偶数

    • left不能为负数

  2. DP数组初始化错误

    • dp[0]必须初始化为1

    • 其他位置初始化为0

  3. 遍历顺序错误

    • 必须从后往前遍历背包容量

    • 否则会重复计算

  4. 不理解状态转移方程

    • 记住:dp[j] = 不选的方法 + 选的方法

    • 选的方法数 = 装满剩余容量的方法数

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 8:02:37

springboot企业人事工资管理系统-开题报告

目录 开题报告背景与意义系统核心功能模块技术选型与创新点预期成果与难点研究方法与计划 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 开题报告背景与意义 随着企业规模扩大和人力资源管理复杂度提升…

作者头像 李华
网站建设 2026/6/10 11:12:11

交互装置在2026展厅展馆中的常见展项

在当代展厅和展馆中&#xff0c;交互装置已经成为不可或缺的重要组成部分。这些装置不仅提升了观众的参观体验&#xff0c;还增强了展览内容的传达效果和记忆点。从多种多样的互动展项中&#xff0c;我们可以看到交互装置在展厅展馆中的多方面重要性。 交互装置极大地提升了观众…

作者头像 李华
网站建设 2026/6/9 20:00:21

<span class=“js_title_inner“>从数据供给到价值变现的闭环构建|大模型与数据要素论坛圆满落幕!</span>

汇聚来自产学研各界的顶级专家与企业领袖&#xff0c;共同探讨如何通过数据采集、标注、生产、评估、交易流通等全链路环节&#xff0c;构建“行业数据模型”的AI产品闭环&#xff0c;推动新质生产力蓬勃发展。 在大模型时代&#xff0c;数据已成为模型发展重要要素。近日&…

作者头像 李华
网站建设 2026/6/10 0:27:20

百考通「降重+降AI」双模优化功能:一键化解查重与AI检测双重压力

面对日益严格的学术审核机制&#xff0c;当代大学生不仅要应对传统查重系统的文字重复率要求&#xff0c;还需警惕各类AI内容检测工具对“生成痕迹”的识别。许多学生即便独立完成论文&#xff0c;也可能因语言风格过于规范、逻辑结构高度清晰而被误判为AI代写&#xff1b;而借…

作者头像 李华