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

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


题目来源

本题来源为:

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];
    }
};
相关文章
|
Java Linux 开发工具
IDEA中git提交前如何关闭code analysis以及开启格式化代码
【10月更文挑战第12天】本文介绍了在 IntelliJ IDEA 中关闭代码分析和开启代码格式化的步骤。关闭代码分析可通过取消默认启用检查或针对特定规则进行调整实现,同时可通过设置 VCS 静默模式在提交时跳过检查。开启代码格式化则需在 `Settings` 中配置 `Code Style` 规则,并通过创建 Git 钩子实现提交前自动格式化。
4640 3
|
Docker 容器
docker设置国内镜像源
docker设置国内镜像源
38139 5
|
缓存 监控 算法
2023Fiddler抓包学习笔记 -- 环境配置及工具栏介绍
2023Fiddler抓包学习笔记 -- 环境配置及工具栏介绍
315 0
|
JavaScript 前端开发 Linux
【工具】Fiddler使用教程
【工具】Fiddler使用教程
755 0
|
Java 索引
【Java】dp数组的遍历方向
文章目录 前言 创建数组 反向遍历 分析 斜向遍历 分析
【Java】dp数组的遍历方向
|
2天前
|
数据采集 人工智能 安全
|
12天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1023 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话