【动态规划专栏】背包问题:目标和

简介: 【动态规划专栏】背包问题:目标和


题目来源

本题来源为:

Leetcode494. 目标和

题目描述

给你一个非负整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :

例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

算法原理

先将问题转化成背包问题:

1.状态表示

经验+题目要求

对于本题而言就是:

dp[i][j]表示:从前i个数中选,总和正好等于j,一共有多少种选法

2.状态转移方程

还是从最后位置分情况讨论:

跟01背包问题没区别:

因此状态方程为:

3.初始化

跟01背包问题基本一样:

4.填表顺序

从上往下

5.返回值

dp[n][a]

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:
    int findTargetSumWays(vector<int>& nums, int target) 
    {
        int sum=0;
        for(auto x:nums)
        sum+=x;
        int aim=(sum+target)/2;
        //处理一下边界条件
        if(aim<0||(sum+target)%2)
        return 0;
        int n=nums.size();
        //创建dp表
        vector<vector<int>> dp(n+1,vector<int>(aim+1));
        //初始化
        dp[0][0]=1;
        //填表
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=aim;j++)
            {
                dp[i][j]=dp[i-1][j];
                if(j>=nums[i-1])
                    dp[i][j]+=dp[i-1][j-nums[i-1]];
            }
        }
        return dp[n][aim];
    }
};

空间优化

代码实现:

class Solution 
{
public:
    int findTargetSumWays(vector<int>& nums, int target) 
    {
        int sum=0;
        for(auto x:nums)
        sum+=x;
        int aim=(sum+target)/2;
        //处理一下边界条件
        if(aim<0||(sum+target)%2)
        return 0;
        int n=nums.size();
        //创建dp表
        vector<int> dp(aim+1);
        //初始化
        dp[0]=1;
        //填表
        for(int i=1;i<=n;i++)
        {
            for(int j=aim;j>=nums[i-1];j--)
            {
                 dp[j]+=dp[j-nums[i-1]];
            }
        }
        return dp[aim];
    }
};
相关文章
|
7天前
|
人工智能 JavaScript 机器人
保姆级教程:2026年阿里云上+本地部署OpenClaw(Clawdbot)及集成QQ机器人指南
2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自然语言指令+任务自动化”的核心优势,成为个人与轻量团队搭建专属AI助手的首选工具。它不仅能实现智能对话,更能联动QQ、飞书等多平台,自动执行文件处理、信息查询、定时任务等实操性工作,堪称“24小时在线的私人AI员工”。本文将全程拆解**2026年阿里云OpenClaw超简单部署步骤**、本地私有化部署流程,重点讲解QQ机器人全流程集成,附带详细代码命令、避坑指南与实战测试,零基础新手也能零失误落地,全程不超过25分钟,彻底打破技术门槛。
239 5
|
12天前
|
Windows
Zotero7.0.8 文献管理安装步骤详解(附文献管理与同步设置教程)
Zotero 7.0.8 是一款免费开源的文献管理工具,支持文献采集、分类、笔记及自动生成参考文献。本安装包为Windows版,含详细中文安装与使用指南,助你快速上手科研写作。(239字)
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
123_自监督任务变体:Causal LM详解 - GPT-style下一词预测机制与训练优化
2025年,自监督学习已成为大型语言模型(LLM)训练的核心范式,其中因果语言建模(Causal Language Modeling, CLM)作为GPT系列模型的基础训练目标,展现出了卓越的生成能力和下游任务迁移性能。与掩码语言建模(Masked Language Modeling, MLM)不同,因果语言建模专注于预测序列中的下一个词元,这种训练方式自然地适应了自回归生成的需求,为文本生成、对话系统等任务奠定了坚实基础。
|
7月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
224 4
|
3月前
|
SQL 自然语言处理 数据可视化
构建AI智能体:四十三、智能数据分析机器人:基于Qwen-Agent与Text2SQL的门票分析方案
摘要:本文介绍了一个基于Qwen-Agent和Text2SQL技术的智能门票数据分析系统。该系统通过自然语言交互降低技术门槛,使业务人员可直接查询和分析数据。系统采用分层架构设计,包含用户交互层、智能代理层、工具执行层和数据服务层,核心功能包括自然语言理解、SQL生成、数据查询和可视化展示。文章详细阐述了系统流程、核心代码实现及优化策略,展示了如何通过大语言模型实现企业级数据分析应用的智能化转型,有效解决了传统数据分析流程中响应慢、沟通成本高等痛点。
326 7
|
4月前
|
弹性计算 安全 网络协议
阿里云DDoS高防和DDoS原生防护有什么区别?如何选择DDoS防护产品?
阿里云DDoS防护含原生防护与高防:原生防护透明接入,免改IP,限阿里云内资源,防L3/L4攻击;高防通过代理接入,支持L3-L7全层防护,可护非阿里云服务器,抗CC攻击。根据业务位置、攻击类型及延迟要求选择。详情见官方文档。
262 2
|
机器学习/深度学习 传感器 数据采集
《DeepSeek赋能工业互联网:解锁数据深度分析新姿势》
DeepSeek作为AI大模型领域的佼佼者,为工业互联网的数据深度分析开辟了新路径。其智能传感器融合技术精准高效地采集各类工业设备数据,并结合边缘计算进行预处理,确保数据实时传输。强大的深度学习算法能挖掘复杂工业数据中的潜在价值,预测生产趋势并实时监测异常,多模态数据融合分析则实现全面洞察。自适应学习能力保障模型持续优化,助力企业降本增效、创新发展,推动制造业迈向新高度。
337 3
|
Java Linux 开发工具
IDEA中git提交前如何关闭code analysis以及开启格式化代码
【10月更文挑战第12天】本文介绍了在 IntelliJ IDEA 中关闭代码分析和开启代码格式化的步骤。关闭代码分析可通过取消默认启用检查或针对特定规则进行调整实现,同时可通过设置 VCS 静默模式在提交时跳过检查。开启代码格式化则需在 `Settings` 中配置 `Code Style` 规则,并通过创建 Git 钩子实现提交前自动格式化。
5545 3
|
固态存储 内存技术
升级电脑内存和硬盘
升级电脑内存和硬盘
463 6