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

题意:已知一个数组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. (二)java多线程之synchronized

    本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco198 ...

  2. iOS开发 - 适配Https的野路子

    大致写下适配Https时遇到的坑,做完服务器迁移一直通宵到现在,表示无力再多做详解,只放一些常见问题的解决方案吧 问题一.Https请求失败 1. NetManager初始化时可参考如下设置(因为我没 ...

  3. 视差滚动特效图片滑块-Sequence.js

    效果演示     插件下载

  4. WebService学习--股票走势图+天气预报实现

        互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取股票数据和天气预报为例进行学习 ...

  5. uoj#179 线性规划

    这是一道模板题. 本题中你需要求解一个标准型线性规划: 有nn个实数变量x1,x2,⋯,xnx1,x2,⋯,xn和mm条约束,其中第ii条约束形如∑nj=1aijxj≤bi∑j=1naijxj≤bi. ...

  6. ajax从新浪获取实时股票数据

    最近在给公司做一个报表展示,然后领导要求上面加上一些股票的实时数据展示. 一开始同事给我一个聚合数据的网址,说从这上面可以获取到.我一看,哟呵,API接口什么的都提供好了,确实方便.然后想用的时候才发 ...

  7. 【react】利用prop-types第三方库对组件的props中的变量进行类型检测

    1.引言--JavaScript就是一个熊孩子   1.1对于JSer们来说,js是自由的,但同时又有许多让人烦恼的地方.javascript很多时候就是这么一个熊孩子,他很多时候并不会像C和java ...

  8. Java学习记录第一章

    学习Java第一章的记录,这一章主要记录的是Java的最基础部分的了解知识,了解Java的特性和开发环境还有Java语言的优缺点. 计算机语言的发展大概过程:机器语言--->汇编语言---> ...

  9. 详解全站 HTTPS 访问优化

    HTTPS 协议就是 HTTP+SSL/TLS,即在 HTTP 基础上加入 SSL /TLS 层,提供了内容加密.身份认证和数据完整性3大功能,目的就是为了加密数据,用于安全的数据传输. HTTPS ...

  10. cctype学习

    #include <cctype>(转,归纳很好) 头文件描述: 这是一个拥有许多字符串处理函数声明的头文件,这些函数可以用来对单独字符串进行分类和转换: 其中的函数描述: 这些函数传入一 ...