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

【动态规划】力扣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] = 不选的方法 + 选的方法

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

http://www.jsqmd.com/news/334134/

相关文章:

  • 2026年武汉/深圳/苏州/金华/厦门女性植发机构推荐榜 - 极欧测评
  • 2026年贵阳养老机构优选:云岩区康祥养老院——融合照护、康复与陪伴的安心之选 - 深度智识库
  • 基于时空风险场的道路自动驾驶车辆预测轨迹规划
  • 有哪些好用的降AI工具?还有免费ai查重福利!盘点2026论文降AIGC率5款实用软件
  • 精准定向不踩坑!2026年寻北仪、测斜仪厂家排行榜(附选型推荐) - 深度智识库
  • 有哪些好用的降AI工具?盘点2026论文降AIGC率5款实用软件,亲测把AI率降低到5%以下!
  • 从实验出发深入理解Linux目录权限:r、w、x分别控制什么?能否进入目录到底由谁决定? - 指南
  • 有哪些好用的降AI工具?不花一分钱去机味!盘点2026论文降AIGC率5款实用软件
  • <span class=“js_title_inner“>以APB为例,多外设验证的陷阱</span>
  • TikTok跨境电商进阶打法:把“流量”变成“可复制的成交系统”
  • 论文AI率高怎么办?有哪些好用的降AI工具?盘点2026论文降AIGC率5款实用软件
  • Clawdbot 技术实战:基于一步 API 快速接入,打造本地化 AI 自动化助手
  • 【大模型应用开发】第一阶段:提示工程与上下文学习 (Prompt Engineering ICL)
  • CH394Q 接收/发送流程
  • Claude Code | Commands 最佳配置案例(中文)
  • 拆解AI漫剧全流程:从创意到上线,技术如何实现低成本高效创作?
  • 2026成都招投标文件代做公司排行:标兵标书领衔,这4家优质机构值得关注 - 深度智识库
  • 盘点主流小程序服务商:技术特点、解决方案与行业适配性分析
  • 不用买新耳机!用 Windows Sonic 让普通耳机变“沉浸式”
  • CH9121T/A TNOW脚用法
  • 2月2日 人生管理也是性能量的管理
  • 企业AI如何开发:从零构建一个能理解、会规划的“数字员工”
  • OpenClaw+一步API实战:本地化AI自动化助手从部署到落地全指南
  • 如何破解智慧养老“三大难题” ,惠及更多老年群体?
  • 【实操教程】Clawdbot本地部署与一步API接入完整指南:打造专属AI自动化工具
  • 【开题答辩全过程】以 基于Springboot的酒店住宿信息管理系统的设计与实现为例,包含答辩的问题和答案
  • CVE-2025-29927 Next.js 中间件授权绕过漏洞检测工具
  • Ansys Comsol力磁耦合仿真:直接与间接耦合方式、电磁无损检测技术磁场分析
  • 【IEEE出版、快速EI检索】2026年人工智能、教育技术与应用国际学术会议(AIETA 2026)
  • 【EI稳定检索、上海大学主办】第六届应用数学、建模与智能计算国际学术会议(CAMMIC 2026)