题目一 494. 目标和

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

示例 1:

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

输出: 5

解释:

-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

一共有5种方法让最终目标和为3。

注意:

数组非空,且长度不会超过20。

初始的数组的和不会超过1000。

保证返回的最终结果能被32位整数存下。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/target-sum

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

由题,可以将数字分为两个集合(子集和余集)。

(有) 子集sum-余集sum=S

(两边同时加上子集sum+余集sum)子集sum+余集sum+子集sum-余集sum=子集sum+余集sum+S

(即) 2*子集sum=集合sum+S

(即) 子集sum=(集合sum+S)/2

故问题转换为求子集和为固定值有多少种组合情况其中每个数都可以选或不选,可作0-1背包问题求解。

在遍历到num时,dp[j]表示只使用num及之前遍历过的num,和为j的组合情况种数。 ,可以和经典0-1背包问题的一维数组情况比对,理解0-1背包问题。

其他

todo 还可以用dfs求解。

代码

class Solution {
public int findTargetSumWays(int[] nums, int S) {
int setSum=0;
for(int num:nums) {
setSum+=num;
} if((setSum+S)%2==1) {
return 0;
} int subSetSum=(setSum+S)/2;
int[] dp=new int[subSetSum+1];
dp[0]=1;
for(int num:nums) {
for(int j=subSetSum;j>=num;--j) {
dp[j]+=dp[j-num];
}
}
return dp[subSetSum];
}
}

题目二 416. 分割等和子集

给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

注意:

每个数组中的元素不会超过 100

数组的大小不会超过 200

示例 1:

输入: [1, 5, 11, 5]

输出: true

解释: 数组可以分割成 [1, 5, 5] 和 [11].

示例 2:

输入: [1, 2, 3, 5]

输出: false

解释: 数组不能分割成两个元素和相等的子集.

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/partition-equal-subset-sum

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  • 看到这个题,就联想到了上面的题。同样可变为求子集和是否成立的问题,即可以用0-1背包求解。
  • 要注意和为奇数的特判

todo

  • 事实上这个题在第70+个用例没过,但是平台上测试这个用例是过的,改天再提一下试试。
  • 还有进阶的分为k个和相等的子集,待做。

代码

public static boolean canPartition(int[] nums) {
if (nums == null || nums.length == 0) {
return false;
} int sum = 0;
for (int num : nums) {
sum += num;
}
if (sum % 2 == 1) {
return false;
} int half = sum / 2;
int[] dp = new int[half + 1];
Arrays.fill(dp, 0);
dp[0] = 1;
for (int num : nums) {
for (int j = half; j >= num; --j) {
dp[j] += dp[j - num];
}
if (dp[half] > 0) {
return true;
}
}
return false;
}

[LeetCode]494. 目标和、416. 分割等和子集(0-1背包,DP)的更多相关文章

  1. Leetcode 416分割等和子集

    416. 分割等和子集 已知是个背包问题,由于可以等分为两部分,所以必定是个偶数. 一开始想到的是回溯法 bool helper(vector<int>&nums, int i, ...

  2. Java实现 LeetCode 416 分割等和子集

    416. 分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: ...

  3. Java实现 LeetCode 494 目标和

    494. 目标和 给定一个非负整数数组,a1, a2, -, an, 和一个目标数,S.现在你有两个符号 + 和 -.对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面. 返回可 ...

  4. Leetcode 416.分割等和子集

    分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [ ...

  5. leetcode 494. 目标数

    题目描述: 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在你有两个符号 + 和 -.对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面. 返回可以 ...

  6. Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)

    Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum) 深度优先搜索的解题详细介绍,点击 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在 ...

  7. Mask R-CNN用于目标检测和分割代码实现

    Mask R-CNN用于目标检测和分割代码实现 Mask R-CNN for object detection and instance segmentation on Keras and Tenso ...

  8. [LeetCode]121、122、309 买股票的最佳时机系列问题(DP)

    121.买卖股票的最佳时机 题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意 ...

  9. [LeetCode] 494. Target Sum 目标和

    You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symb ...

随机推荐

  1. bluecms v1.6 代码审计

    0x01 使用seay源代码审计系统进行审计 扫描到了很多个可疑漏洞,不过工具都有一定的误报,下面我们就逐个进行验证 0x02 /ad_js.php SQL注入漏洞 查看源码,我们发现程序通过GET方 ...

  2. 关于python中Enum的个人总结

    关于python中Enum的个人总结 初识 可以通过enum模块导入 语法 初始化: 可以通过enum_ = Enum('class_name', names,start = 1)来创建,其中name ...

  3. node.js 模拟自动发送邮件验证码

    node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...

  4. 简单解析PAT、PMT的程序

    刚开始学习有关TS.PAT.PMT方面的内容,参考了别人的一些程序,然后写了一个简单的解析TS的小程序.如果有地方错误,请发邮件给我843036544@qq.com. #include<stdi ...

  5. 冒泡排序(Bubble Sorting)

    基本介绍 时间复杂度O(n^2) 冒泡排序(Bubble Sorting)的基本思想是:通过对待 排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大 的元素逐 ...

  6. CentOS 阿里源

    [centos] name=centos baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/ enabled= gpgcheck= [epel] ...

  7. Robot Framework(8)——脚本语法示例记录

    大神写了一个Robot Framework的脚本,好多语法之前没接触过,就有了这篇,记录下来一起学习,欢迎纠错 第二三四五列,一般是入参,红色的表示必填的入参.浅灰色表示选填的入参.深灰色表示无需填写 ...

  8. 1、Entity Framework Core 3.1入门教程-概述和准备工作

    本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...

  9. docker部署数据库

    搜索数据库镜像images docker search mysql 搜索结果如下图所示: 选择合适自己的mysql版本 因为mysql新版本出来了,很多特性没有学习,所以笔者安装了mysql:5.6 ...

  10. 基于Nodejs的sequelize操纵数据库

    ## 使用基于ORM架构的sequelize操纵数据库 ### 1.技术背景 ```Sequelize是一个基于promise的关系型数据库ORM框架,*********************技术文 ...