LeetCode494. 目标和 0-1背包DP

从零开始的计网学习——物理层 计算机网络对于IT人不论是就业还是升学都是核心的一门课程,一起从零开始,学习计算机网络! 阅读详情

题目描述

  • 给你一个整数数组 nums 和一个整数 target 。

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

  • 例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。
    返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

示例 1:
输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3

示例 2:
输入:nums = [1], target = 1
输出:1

遍历

class Solution {
    int res;
    int target_sum;
    public int findTargetSumWays(int[] nums, int target) {
        target_sum = target;
        dfs(0,nums,0);
        return res;
    }


    void dfs(int layer, int[] nums, int cur_value) {
        if(layer == nums.length) {
            if(cur_value == target_sum) res++;
            return;
        }
        dfs(layer + 1,nums,cur_value + nums[layer]); 
        dfs(layer + 1,nums,cur_value - nums[layer]); 
    }
}

动态规划

        此时我们的问题转换 为从nums中选取m个数,能使其和为 (target + sum) / 2 。返回满足条件组合的个数。

在这里插入图片描述

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        /* 在进行动态规划算法之前需要进行下面的判断和计算 */
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
        }
        int diff = sum - target;
        if (diff < 0 || diff % 2 != 0) {
            return 0;
        }
        int n = nums.size();
        int neg = diff / 2;
        /* 定义dp数组 */
        vector<vector<int>> dp(n + 1, vector<int>(neg + 1));
        /* dp数组初始化 */
        dp[0][0] = 1;
        /* 遍历 */
        for (int i = 1; i <= n; i++) {// 先遍历物品
            for (int j = 0; j <= neg; j++) { // 再遍历背包容量,二维和j的顺序无关,for (int j = neg; j >= 0; j--)也行
                dp[i][j] = dp[i - 1][j];
                /* 如果背包剩余j的容量大于放的物品nums[i-1]则就可以将物品nums[i-1]放入背包中 */
                if (j >= nums[i - 1]) {
                    dp[i][j] += dp[i - 1][j - nums[i - 1]];
                }
            }
        }
        return dp[n][neg];
    }
};

// 作者:Nehzil
// 链接:https://leetcode.cn/problems/target-sum/solution/mu-biao-he-by-nehzil-x5am/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

维度压缩的code

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        /* 在进行动态规划算法之前需要进行下面的判断和计算 */
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
        }
        int diff = sum - target;
        if (diff < 0 || diff % 2 != 0) {
            return 0;
        }
        int n = nums.size();
        int neg = diff / 2;
        /* 定义dp数组 */
        vector<int> dp( vector<int>(neg + 1));
        /* dp数组初始化 */
        dp[0] = 1;
        /* 遍历 */
        for (int i = 1; i <= n; i++) {// 先遍历物品
            for (int j = neg; j >= 0; j--) { // 再遍历背包容量
                // dp[i][j] = dp[i - 1][j];
                /* 如果背包剩余j的容量大于放的物品nums[i-1]则就可以将物品nums[i-1]放入背包中 */
                if (j >= nums[i - 1]) {
                    dp[j] += dp[j - nums[i - 1]];
                }
            }
        }
        return dp[neg];
    }
};

CG

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能 阅读详情

相关推荐

【Python学习日记:PySide6】【持续更新】

说明:PySide6 是 Qt for Python 的一部分,是一个 Python 绑定库,可以用来创建跨平台的 GUI 应用程序。它将 Qt 框架的丰富功能带到了 Python 环境中,允许开发者使用 Python 编写 GUI 应用程序。

XLQ的博客 8044

leetcode494:目标和

leetcode494:目标和 给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加'+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

m0_63743577的博客 555

【阿里云大模型高级工程师ACP习题集】2.4 自动化评测答疑机器人的表现(⭐️⭐️⭐️ 重点章节!!!)

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 2480

leetCode494—目标和

每日一题 leetCode,今天是经典动态规划,leetCode494—目标和 题目:给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加'+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。 返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。 示例 1: 输入:nums = [1,1.

weixin_46214235的博客 1029

华北理工大学以升实验班蓝桥杯选拔赛题解

文章目录华北理工大学以升实验班蓝桥杯选拔赛题解A:期末考试题目描述题目讲解代码B:月份题目描述题目讲解代码C:打饭题目描述题目讲解代码D : 正弦波信号题目描述题目讲解代码E : 亲爱的长方形题目描述题目讲解代码F:挖金子题目描述题目讲解代码G : 金金的游戏题目描述题目讲解代码H : 区间和题目描述题目讲解代码详细视频讲解请关注华北理工大学b站账号。 华北理工大学以升实验班蓝桥杯选拔赛题解 A:期末考试 题目描述 Description 期末考试过去许多天了,如今成绩都出来了,那么现在让我们对成绩我分个类

Qq1739206233的博客 1128

Multisim仿真入门:单相半波可控整流电路从搭建到波形分析(附避坑指南)

本文为电力电子技术初学者提供了一份详细的Multisim仿真指南,手把手教你从零搭建单相半波可控整流电路。通过对比纯电阻、阻感负载及加入续流二极管后的波形变化,直观理解晶闸管触发、电感续流等核心原理,并附有实用的参数设置与常见问题避坑指南,帮助你将抽象理论转化为可视化的工程实践。

weixin_29208077的博客 343

【LeetCode】494. 目标和

题目链接:目标和 题目描述: 给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。 返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。 分析:数组中的每一个数字都要用到,而且每一个数字都有两种情况,+或者-。 方法一:回溯(递归,df

Greenary的博客 645

《Zephyr OS 入门与实战》第5章:内存管理策略

【代码】《Zephyr OS 入门与实战》第5章:内存管理策略。

2301_79143213的博客 349

leetcode 494 目标和

即sum( P) - sum(N) == target(就是减号,因为N是负数)即sum( P) + sum(N) + ( sum( P) - sum(N) ) == sum( P) + sum(N) + target;例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1”。则问题转换为:存在多少个子集P,使sum( P) == (target + sum(nums))/2;dp[j] 表示:填满j(包括j)这么大容积的包,

谜底的博客 493

RK3588&RK3576实现 HW-ID DTB(动态加载不同的Kernel DTB)功能

RK平台的U-Boot⽀持检测硬件上的GPIO或者ADC状态动态加载不同的Kernel DTB,暂称为HW-ID DTB(Hardware id DTB)功能。

Wynter 849

Windows 11 安装 JDK 11:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统中安装 JDK 11 的完整流程,包括从 Oracle 官网下载压缩包、解压到自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章还包含一个专为 JDK 11 新特性设计的测试程序,涵盖 Lambda 表达式 var 语法、HTTP 客户端 API、字符串增强方法等,帮助读者确认安装版本正确无误,适合初学者和需要多版本 JDK 共存的开发者参考。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2781

LeetCode-494. 目标和

494.目标和 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号+和-。对于数组中的任意一个整数,你都可以从+或-中选择一个符号添加在前面。 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 示例 1: 输入: nums: [1, 1, 1, 1, 1], S: 3 输出: 5 解释: -1+1+1+1+1 = 3 +...

章小幽的博客 272

吃透工业通信:C#工控机实现Modbus、OPC UA、Profinet、EtherCAT协议全适配

本文介绍了基于C#的工业通信协议全适配方案,采用分层架构设计实现Modbus、OPC UA、Profinet和EtherCAT四种主流协议的统一管理。核心包括:1)三层架构(应用层、抽象层、协议层)降低耦合;2)定义统一通信接口IIndustrialCommunication;3)工厂模式创建不同协议实例;4)以Modbus TCP为例展示具体实现。该方案经过实际项目验证,可简化多协议设备管理,提升工业自动化系统的开发效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 725

LeetCode刷题复盘笔记—一文搞懂0 - 1背包之494. 目标和问题(动态规划系列第九篇)

LeetCode刷题复盘笔记—一文搞懂0 - 1背包之494. 目标和问题(动态规划系列第九篇)运算结果等于 target 的不同 表达式 的数目。示例 1:输入:nums = [1,1,1

Lucky_Alan_Gareth的博客 1232

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LeetCode 494. 使用 + / - 构成目标和 S 的方法数(Medium)

【题目链接】 题解 目标和 动态规划最容易理解的方式 思路 代码 class Solution: ### 0106 动态规划(712 ms,17.1 MB) def findTargetSumWays(self, nums: List[int], S: int) -> int: # 初始化计算非负数组的总和 total_sum, n = sum(nums), len(nums) # 定义二维动态规划数组dp,int型的默认字.

newCraftsman的博客 217

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【LeetCode】【算法】494.目标和

LeetCode 494.目标和

passer__jw767的博客 808

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

备考蓝桥杯:用01背包解决力扣第494题

首先看dp[0][j],如果物品0的重量刚好等于背包重量,那么有一种装满方法,如果物品0的重量小于或者大于背包的重量,没有装满方法,方法为0。其次来看dp[i][0],如果物品0的重量为0,那么dp[0][0]=2(选择正0或者负0),如果物品1的重量也为0,那么dp[1][0]=4(两个正0两个负0排列组合),这一点要尤为注意,因此,这里的初始化是和物品重量是否为0有关的,具体操作大家可以看我的代码。我们建立二维dp数组,dp[i][j]就代表背包容量为j时在前i个物品中选择物品装满背包的所有方法数。

2401_88018175的博客 1182

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

dp[j]装满容量为 j 的背包,有 dp[j] 种方法边界条件时直接返回0必须是偶数left不能为负数DP数组初始化错误dp[0]必须初始化为1其他位置初始化为0遍历顺序错误必须从后往前遍历背包容量否则会重复计算不理解状态转移方程dp[j] = 不选的方法 + 选的方法选的方法数 = 装满剩余容量的方法数。

2301_80889423的博客 567

代码随想录算法训练营Day31| LeetCode 1049 最后一块石头的重量 II、494 目标和、474 一和零

代码随想录算法训练营第三十一天内容,0-1背包思想的一些实践,再接再厉!

修炼途中的所见所闻,所思所想。 1149

Coding | [代码随想录][动态规划] 494.目标和

本文探讨了使用动态规划解决"目标和"问题的方法。通过分析问题,发现可以将目标表达式转换为类似0-1背包问题的子问题组合。文章详细描述了构建二维dp数组的思路,其中dp[i][j]表示前i个数组成j的方法数。在调试过程中,作者通过举例演算解决了初始化、边界设置和数组更新等关键问题。最终给出的解法时间复杂度为O(n*totalSum),空间复杂度相同。该解决方案通过动态规划有效计算了所有可能构成目标值的表达式数目。

Panda8qaq的博客 954

leetcode 动态规划——01背包问题系列

与lc416分割等和子集基本一样尽可能分为两堆重量相近的石堆则以sum // 2为背包容量,石头重量==石头价值,求背包最大价值。

Ymmmm__的博客 398

leedcode 494. 目标和

力扣 494.目标和

a87117869的博客 418

LeetCode:494.目标和

首先根据题意有三个数,一个是加号数的和,一个是减号数的和,还有是总和sum,设加号数的和为x,那减号数的和就是sum-x,target=x-(sum-x),所以x=(target+sum)/2,所以我们把这个数设为背包大小,只找为加号的数的部分。所以递推公式dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]];递推公式dp[i][j]的值包括当前物品i是否放入,如果不放入,其值是dp[i-1][j],如果放入,其值即为dp[i-1][j-nums[i]]

2301_80647234的博客 204

力扣 494. 目标和 —— 回溯 & 动态规划双解法全解(Java 实现)

在数组与动态规划结合的面试题库中,LeetCode 494 目标和是一道极具代表性的经典题目。它以 “给数组元素添加正负号得到目标和” 为目标,既不依赖复杂数学推导,也不涉及冷门数据结构,却精准考察了回溯剪枝思想、状态定义设计、0-1 背包模型转化以及空间优化四大核心能力。看似简单的符号选择,背后藏着从暴力穷举到最优子结构的完整算法演进逻辑,也是面试官常用来检验算法思维是否严谨的高频考题。

l7_yuqi的博客 624

【leetcode题解——动态规划之0-1背包】494.目标和

01背包的滚动数组/二维数组联合分析

qingshu79的博客 345

动态规划专练:力扣第494、474题

本文分析了力扣两道动态规划题目。第494题“目标和”通过将问题转化为01背包问题,计算正负子集的和差,使用一维DP数组统计方案数,时间复杂度和空间复杂度分别为O(nval)和O(val)。第474题“一和零”是二维约束的01背包问题,需要预处理字符串的0/1数量,用二维DP数组记录在不同0/1限制下的最大字符串数量,复杂度为O(S+strsSizemn)和O(strsSize+mn)。两题都体现了动态规划的核心思想,通过状态转移方程和合理设计DP数组维度来解决问题。

hanlin03的博客 172
上一篇: LeetCode279. 完全平方数 DP完全背包
下一篇: leetcode1584. 连接所有点的最小费用 最小生成树
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值