这是一道水题,作为没有货的水货楼主如是说。

题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S

c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选。

求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立。

例如:

输入:nums is [1, 1, 1, 1, 1], S is 3.
输出 : 5
符合要求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

但是看完题的你们说,楼主这个题目的难度是中等题呀!

好吧,楼主说错了,它是中等题,但毋庸置疑这是一道动态规划的水题,是一个背包问题,不知道的背包问题的同学请百度下《背包九讲》。

注意:看那个《背包九讲》可能开始会感到生涩难懂,但是前方高能东西都是牛逼的东西。

回归到本题中,乍一看它是一个搜索问题,即搜索出所有可能的解即可,因为n最多为20,搜索一把也能顺利完成,解决也是比较容易的。

但是就没有更好的方法了吗?这时我们注意到0<ai <=1000这个条件,这么小的数值让我们很快联想到了动态规划。

没错,这是一个多阶段的背包问题,其中的难点是负数这么表示。

我们可以将[-max,max]映射到[0,2*max]就解决问题了。

我们现在可以想出以下的状态转移方程:

dp[i][j] = dp[i-][j-a[i]] + dp[i-][j+a[i]]( <= i <= n, < j <  * sum(a[i]) + )

即i代表有多少个数,j - sum(a[i])代表每一种算出来的答案,dp[i][j]代表在答案j - sum(a[i])的情况下的c1,c2,c3,...,ci}的排列牌数。很明显当前的状态dp[i][j]是从上一次(i-1)的数加上当前的 a[i]得到的。

这样我们只要开出一个n * (2 * sum(a[i]) + 1)的数组,在O(n * (2 * sum(a[i]) + 1))的时间复杂度下解决这个问题。

那么还可以优化吗?答案是肯定的。

我们从状态转移方程中不难看出,在每一次转移的时候都只用了i-1次的答案和i次的结果,为此我们可以使用滚动数据对它进行优化。

只要我们开出2 * (2 * sum(a[i]) + 1)的数据,这样我们又再次优化了内存。

即我们可以在时间复杂度为O(n * (2 * sum(a[i]) + 1)) 和空间复杂度(2 * (2 * sum(a[i]) + 1)) 的情况下解决该问题。

下面上golang的代码(居然没有golang的语言编辑器,求增加)

 func findTargetSumWays(nums []int, S int) int {
mid :=
for _,v := range nums{
mid += v
}
dp := make([][]int, )
for i,_:=range dp{
dp[i] = make([]int, mid + mid + )
}
dp[][mid] =
for i,v := range nums{
for j,_:= range dp[(i + )%]{
dp[(i + )%][j] =
}
for j:=; j <= mid + mid; j++{
if j >= v {
dp[(i+)%][j-v] += dp[i%][j]
}
if j + v <= mid + mid {
dp[(i+)%][j+v] += dp[i%][j]
}
}
}
if S > mid || S < -mid{
return
} return dp[len(nums)%][S+mid]
}

Leetcode 494 Target Sum 动态规划 背包+滚动数据的更多相关文章

  1. LN : leetcode 494 Target Sum

    lc 494 Target Sum 494 Target Sum You are given a list of non-negative integers, a1, a2, ..., an, and ...

  2. [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 ...

  3. [Leetcode] DP -- Target Sum

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

  4. LC 494. Target Sum

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

  5. 【LeetCode】494. Target Sum 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...

  6. 【leetcode】494. Target Sum

    题目如下: 解题思路:这题可以用动态规划来做.记dp[i][j] = x,表示使用nums的第0个到第i个之间的所有元素得到数值j有x种方法,那么很容易得到递推关系式,dp[i][j] = dp[i- ...

  7. 494. Target Sum - Unsolved

    https://leetcode.com/problems/target-sum/#/description You are given a list of non-negative integers ...

  8. 494. Target Sum

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

  9. 494. Target Sum 添加标点符号求和

    [抄题]: You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have ...

随机推荐

  1. 探讨.NET Core数据加密和解密问题

    前言 一直困扰着我关于数据加密这一块,24号晚上用了接近3个小时去完成一项任务,本以为立马能解决,但是为了保证数据的安全性,我们开始去对数据进行加密,然后接下来3个小时专门去研究加密这一块,然而用着用 ...

  2. 对象Equals相等性比较的通用实现

    最近编码的过程中,使用了对象本地内存缓存,缓存用了Dictionary<string,object>, ConcurrentDictionary<string,oject>,还 ...

  3. focus、blur事件的事件委托处理(兼容各个流浏览器)

    今天工作中遇到个问题,问题是这样的,一个form表单中有比较多的input标签,因为form中的input标签中的值都需要前端做客户端校验,由于本人比较懒而且特不喜欢用循环给 每个input元素添加b ...

  4. 接口加密《二》: API权限设计总结

    来源:http://meiyitianabc.blog.163.com/blog/static/105022127201310562811897/ API权限设计总结: 最近在做API的权限设计这一块 ...

  5. 深刻认识shift_ram IP core——图像处理学习笔记

    在进行图像处理算法中,往往需要生成图像像素矩阵,这对于C语言来说可以直接用数据表示,但是对于verilog来说便不是那么容易了,硬件描述语言不比软件,它的核心不再算法,而是在于设计思想,加速硬件.在进 ...

  6. 如何在 ASP.NET Core 中发送邮件

    前言 我们知道目前 .NET Core 还不支持 SMTP 协议,当我么在使用到发送邮件功能的时候,需要借助于一些第三方组件来达到目的,今天给大家介绍两款开源的邮件发送组件,它们分别是 MailKit ...

  7. 在Ueditor / Umeditor中实现上传图片跨域

    近几天公司的后台管理需要图文编辑文章,但是ueditor提供的方法中,本地图片的上传是通过flash的方式处理的,且不支持跨域.若要在已经前后端分离的Angular项目中使用,需要做复杂的环境配置.跟 ...

  8. 什么是体数据可视化(Volume data visualization)?及体绘制的各种算法和技术的特点?

    该文对体数据进行综述,并介绍了体数据的各种算法和技术的特点. 前言 由于3D数据采集领域的高速发展,以及在具有交互式帧率的现代化工作站上执行高级可视化的可能性,体数据的重要性将继续迅速增长. 数据集可 ...

  9. 如何将angular-ui的分页组件封装成一个指令

    准备工作: (1)一如既往的我还是使用了requireJS进行js代码的编译 (2)必须引入angualrJS , ui-bootstrap-tpls-1.3.2.js , bootstrap.css ...

  10. Python实现脚本锁功能,同时只能执行一个脚本

    1. 文件锁 脚本启动前检查特定文件是否存在,不存在就启动并新建文件,脚本结束后删掉特定文件. 通过文件的判断来确定脚本是否正在执行. 方法实现也比较简单,这里以python脚本为例 #coding= ...