9.10目标和(LC494-M)

算法:

加法的绝对值的集合left

减法的绝对值的集合right

nums集合的总和sum

这里的left和right都是绝对值:

left+right=sum    →    right=sum-left

left-right=target  →    left-(sum-left) =target 

 → left = (target + sum)/2 ,target 和sum都是常量

若target + sum为奇数,则无法整除,其实实际意义就是,没有组合能够得到目标和target。

这道题可以用回溯,也可以用01背包。

此时问题就转化为,装满容量为left的背包,有几种方法

为什么是01背包呢?

因为每个物品(示例1中的1)只用一次!

这次和之前遇到的背包问题不一样了,之前都是求容量为j的背包,最多能装多少。

本题则是装满有几种方法。其实这就是一个组合问题了。

动规五部曲:

1.确定dp数组及其下标

dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法

2.确定递推公式

例如:dp[j],j 为5,

  • 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。
  • 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。
  • 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 容量为5的背包
  • 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 容量为5的背包
  • 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 容量为5的背包

那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。

求组合类问题的公式,都是类似这种:

dp[j] += dp[j - nums[i]]

3.dp数组初始化

从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。

举个例子:

如果数组[0] ,target = 0,那么 bagSize = (target + sum) / 2 = 0。 dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。

所以本题我们应该初始化 dp[0] 为 1。

4.确定遍历顺序

nums放在外循环,target在内循环,且内循环倒序。

5.举例推导dp数组

输入:nums: [1, 1, 1, 1, 1], S: 3

bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4

正确代码:

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum = 0;
        for(int i=0; i<nums.length; i++){
            sum += nums[i];
        }
        if ((sum+target)%2 != 0) return 0;
        if (target <0 && sum <-target) return 0;

        int bagsize = (sum+target)/2;
        if (bagsize<0){
            bagsize = -bagsize;
        }
        int[] dp = new int[bagsize+1];
        dp[0] = 1;
        for (int i=0; i<nums.length; i++){
            for(int j=bagsize; j>=nums[i]; j--){
                dp[j] += dp[j-nums[i]];
            }
        }
        return dp[bagsize];


    }
}

注意:

1.当target为负值,而其绝对值大于sum时,背包肯定装不下,return0: 

if (target <0 && sum <-target) return 0;

时间空间复杂度:

  • 时间复杂度:O(n × m),n为正数个数,m为背包容量
  • 空间复杂度:O(m),m为背包容量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/428571.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

python封装,继承,复写详解

目录 1.封装 2.继承 复写和使用父类成员 1.封装 class phone:__voltage 0.5def __keepsinglecore(self):print("单核运行")def callby5g(self):if self.__voltage > 1:print("5g通话开启")else:self.__keepsinglecore()print("不能开启5g通…

xshell安装java/jdk

1.下载jdk wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz 2.解压jdk安装包 tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz 其中第三步 编辑 ~/.bashrc 或 ~/.bash_profile 文件 打开vim文本编辑器 vim ~/.bash_profile export …

TT-100K数据集

TT-100K数据集 TT100K数据集是由清华大学和腾讯联合实验室整理并公布的一个大型交通标志数据集。已整理好由xml格式和txt格式。共6105张图片。 有偿分享。可以加我qq&#xff1a;2638351996。注明来意&#xff01;&#xff01;&#xff01;&#xff01;

深入理解Python递归:注意事项、示例及应用场景

文章目录 一、递归的注意事项二、Python代码示例三、使用场景及代码运行结果四、递归的其他应用场景其他示例 五、总结 递归是编程中的一种强大的技术&#xff0c;它允许函数调用自身来解决问题。在Python中&#xff0c;递归被广泛应用&#xff0c;尤其是在处理数据结构&#x…

算法沉淀——动态规划之01背包问题(leetcode真题剖析)

算法沉淀——动态规划之01背包问题 01.【模板】01背包02.分割等和子集03.目标和04.最后一块石头的重量 II 01背包问题是一类经典的动态规划问题&#xff0c;通常描述为&#xff1a;有一个固定容量的背包&#xff0c;以及一组物品&#xff0c;每件物品都有重量和价值&#xff0c…

大数据核心技术概论

大数据核心技术概述 大数据基石三大论文&#xff1a;GFS&#xff08;Hadoop HDFS&#xff09;、BigTable&#xff08;Apache HBase&#xff09;、MapReduce&#xff08;Hadoop MapReduce&#xff09;。 搜索引擎的核心任务&#xff1a;一是数据采集&#xff0c;也就是网页的爬…

如何用bashrc将远程服务器上的环境变量切换到指定anaconda目录下

如何用bashrc将远程服务器上的环境变量切换到指定anaconda目录下 问题描述解决办法 问题描述 远程服务器上已经配置了tensorflow2环境&#xff0c;但是导入环境时缺显示没有这个环境&#xff0c;需要添加环境变量。 显示没有tensorflow2这个环境。 解决办法 1.使用vi打开编…

串的定义及BF算法

定义 BF算法——朴素查找算法——也叫做串的模式匹配算法 其应用特别多&#xff0c;比如经常在一篇文章里面搜索一些东西&#xff0c;&#xff08;比如文章里的某个内容&#xff0c;或某些关键字词出现的位置&#xff0c;次数等&#xff09; 之前我们大多数情况下是用来搜索关…

【王道操作系统】ch1计算机系统概述-05操作系统引导

文章目录 【王道操作系统】ch1计算机系统概述-05操作系统引导01 什么是操作系统引导02 磁盘里边有哪些相关数据&#xff08;1&#xff09;主引导记录&#xff08;MBR&#xff09;&#xff08;2&#xff09;活动分区&#xff08;一般是C盘&#xff09; 03 操作系统引导的过程 【…

你是否知道Python的列表翻转、排序和多维列表

1.reverse() 表示翻转列表中的元素&#xff0c;不会生成新列表 list1 [2343, 55, 4, 345, 676, 768] list1.reverse() print(list1) # [768, 676, 345, 4, 55, 2343] 2.sort() 对原列表元素进行排序&#xff0c;默认是升序 list1 [2343, 55, 4, 345, 676, 768] list1…

PHP【swoole】

前言 Swoole官方文档&#xff1a;Swoole 文档 Swoole 使 PHP 开发人员可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服务&#xff0c;让 PHP 不再局限于 Web 领域。Swoole4 协程的成熟将 PHP 带入了前所未有的时期&#xff0c; 为性能的提升提供了独一无…

JVM-JVM的垃圾回收机制

一&#xff0c;JVM的垃圾回收机制 IDEA 控制台输出JVM的GC日志,在 VM options 添加 -XX:PrintGCDetails 即可 1.1 如何判定垃圾对象 1.1.1 引用计数法 ​ 在每个对象都维护着一个内存字段来统计它被多少”部分”使用—引用计数器,每当有一个新的引用指向该对象时,引用计数器就…

【Python】进阶学习:pandas--rename()用法详解

【Python】进阶学习&#xff1a;pandas-- rename()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的…

day34贪心算法 part03

1005. K 次取反后最大化的数组和 简单 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数…

软考57-上午题-【数据库】-数据库的控制功能

一、事务管理 1-1、事务的定义 事务是一个操作序列&#xff0c;这些操作&#xff0c;要么都做&#xff0c;要么都不做。 事务和程序是两个不同的概念&#xff0c;一般一个程序可以包含多个事务。 1-2、事务定义的语句 1、事务开始&#xff1a;BEGIN TRANSACTION 2、事务提…

LabVIEW齿轮传动健康状态静电在线监测

LabVIEW齿轮传动健康状态静电在线监测 随着工业自动化的不断发展&#xff0c;齿轮传动作为最常见的机械传动方式之一&#xff0c;在各种机械设备中发挥着至关重要的作用。然而&#xff0c;齿轮在长期运行过程中易受到磨损、变形等因素影响&#xff0c;进而影响整个机械系统的稳…

蓝桥杯集训·每日一题2024 (差分)

前言&#xff1a; 差分笔记以前就做了&#xff0c;在这我就不再写一遍了&#xff0c;直接上例题。 例题&#xff1a; #include<bits/stdc.h> using namespace std; int a[10009],b[100009]; int main(){int n,ans10,ans20;cin>>n;for(int i1;i<n;i){cin>>…

数字经济的新机遇:揭秘Web3的商业价值

引言&#xff1a; 随着技术的飞速发展和互联网的日益普及&#xff0c;数字经济已经成为了当今社会的重要组成部分。而在数字经济的蓬勃发展中&#xff0c;Web3技术被认为是一个颠覆性的力量&#xff0c;它不仅重新定义了数字世界的基础架构&#xff0c;还为商业创新带来了巨大…

嵌入式学习第二十四天!(进程间通信:消息队列、共享内存、信号灯)

进程间的通信&#xff1a; 消息队列、共享内存、信号灯&#xff1a; 1. IPC对象&#xff1a;内存文件 1. ipcs&#xff1a; 查看系统中的消息队列&#xff0c;共享内存、信号灯的信息 2. ipcrm&#xff1a; 删除消息队列、共享内存、信号灯 ipcrm -Q/-M/-S key ipcrm -q/-m/-s…
最新文章