题目如下:

You are given a list of non-negative integers, a1, a2, …, an, and a target, S. Now you have 2 symbols + and -. For each integer, you should choose one from + and - as its new symbol.

Find out how many ways to assign symbols to make sum of integers equal to target S.

Example 1:
Input: nums is [1, 1, 1, 1, 1], S is 3.
Output: 5
Explanation:-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 = 3There are 5 ways to assign symbols to make the sum of nums be target 3.

解题思路:
这题目有一定难度。。。不过由于是数列的数都要使用,那么选了当正数的数出来,剩下的数也就是代表负数了。先合理抽象问题,假设S(r)为在数列里充当正数的数的累计和,S(l)为剩下的数的累计和,那么根据题意容易得到S(r)-S(l)=target。

然而,两个未知数可确定不了解,还有什么可以补充的?那就是数列所有数的和嘛。。。抽象为S(a),意为数列所有数的累计和,得到S(r)+S(l)=S(a)。

两条式子相加,得到S(r)+S(r)=target+S(a)。那么S(r)=(target+S(a))/2。现在的问题完美演变成“从数列里找出n个数的累计和等于(target+S(a))/2”了。由于数列内都为正整数,所以(target+S(a))/2也必须为正数,可得target+S(a)也不会是奇数。

好了,继续抽象这个问题,假设B(n,k)为在前n个数内抽出某些数的累计和为k,从减少规模的情况来看,设n个数最后一个数p一定选中,那么前面部分的数据就需要抽出某些数的累计和等于k-p了,因此得到B(n,k)=B(n-1,k-p)。

至此,低规模数据递推成n规模数据即可。

解题思路代码:

int Method(int *n,int len,int target)
{int *matrix=new int[len+1];ZeroMemory(matrix,len*4+4);int aspt=accumulate(n,n+len,0)+target;if(aspt&1||len<=0) return 0;target=aspt/2;matrix[0]=1;for(int i=0;i<len;++i)for(int p=target;p>=n[i];--p){matrix[p]+=matrix[p-n[i]];}int res=matrix[target];delete[] matrix;return res;
}

Arithmetic problem | Target Sum相关推荐

  1. 加/减数组中的值得到指定的和 Target Sum

    为什么80%的码农都做不了架构师?>>>    问题: You are given a list of non-negative integers, a1, a2, ..., an, ...

  2. leetcode 494. Target Sum | 494. 目标和(动态规划)

    题目 https://leetcode.com/problems/target-sum/ 题解 经典 dp,直接看草稿: class Solution {public int findTargetSu ...

  3. LeetCode—494. 目标和(Target Sum)——分析及代码(Java)

    LeetCode-494. 目标和[Target Sum]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代码 (3)结果 2. 动态规划+节省空间 (1)思路 ...

  4. [Swift]LeetCode1155. 掷骰子的N种方法 | Number of Dice Rolls With Target Sum

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:为敢(WeiGanTechnologies) ➤博客园地址:山青咏芝(https://www.cnblo ...

  5. Leetcode-1155 Number of Dice Rolls With Target Sum(掷骰子的N种方法)

    dp[i][j]表示前i个骰子到达数字总和j的方案数 dp[i][j] = Σdp[i-1][j-k],其中k是一个骰子能掷出的范围 1 #define _for(i,a,b) for(int i = ...

  6. Arithmetic problem | The Triangle

    题目如下: Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers p ...

  7. HDU - 5381 The sum of gcd(莫队/线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问需要回答区间 [L,R][L,R][L,R] 内所有子区间的 gcdgcdgcd 之和.更具体的,对于询问 ...

  8. HDU多校1 - 6955 Xor sum(字典树+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,要求找到一段长度最短的区间,使得异或和大于等于 kkk,如果有多种答案,输出左端点最小的那个 题目分析:倒着维护一下后缀异或和,将后缀异或 ...

  9. HDU - 6955 Xor sum tire树 + 贪心

    传送门 文章目录 题意: 思路: 题意: 给你一个数列aaa,你需要找出来一个长度最小且左端点最靠前的区间,使其异或和≥k\ge k≥k. n≤1e5,0≤ai,k<230n\le1e5,0\l ...

最新文章

  1. [20170914]tnsnames.ora的管理.txt
  2. Codeforces 911F Tree Destruction
  3. UVa11452 Dancing the Cheeky-Cheeky(kmp)
  4. .net Core+Dapper MySQL增删改查
  5. C# 工厂模式 简单入门
  6. Nginx负载均衡、ssl原理,生成ssl密钥对,配置Nginxssl
  7. superobject内存泄漏
  8. 休眠面试问答-最终清单
  9. 【金三银四】启动mysql服务器
  10. 浏览器绑架:曾几何时,喜爱的“百度”成为了“流氓”的代名词?- 移除hao123首页...
  11. 【C++基础学习】C++引用参数与指针参数
  12. 查找 - 计算式查找法 - 哈希法
  13. jquery+ajax验证不通过也提交表单问题处理
  14. shell 并发脚本
  15. pytorch---之固定某些层权重再训练
  16. 40个免费flash相册程序
  17. 【光通信-2】多模单模区别/多模光纤颜色区分/光纤跳线头区分
  18. OSChina 周二乱弹 —— 仙女抚我顶,脱发不长生
  19. 无人车路径规划与控制综述
  20. Linux kernel + busybox自制Linux系统

热门文章

  1. Arnold 渲染设置 - Main - Textures 纹理
  2. 马云的第三次创业:悄然布局三大帝国
  3. 基于asp的微信公众号第三方服务器配置
  4. python量化交易:基础知识_主流的比较流行的Python量化开源框架
  5. 2019/3/24训练日记 谈谈数学---ACM中数学方面的应用(未完ing)
  6. C语言 输入10个数,将其中最小的数与第一个数对换,将最大的数与最后一个数对换
  7. SolidWorks2016中如何绘制扭簧
  8. SAP-MM-PA精解分析系列之基本介绍(02) -组织架构
  9. 如何查询数据表中指定字段的内容?
  10. 注册会计师和高级会计师哪个含金量高 注册会计师和高级会计师的区别