题目描述:

给定一个非负整数数组,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。

注意:

  1. 数组的长度不会超过20,并且数组中的值全为正数。
  2. 初始的数组的和不会超过1000。
  3. 保证返回的最终结果为32位整数。

思路分析:

思路一:用递归深搜,效率很低。存在重复计算。

思路二:动态规划。由于题目中说明了不会超过1000,利用一个2000的数组来存正数和负数。

代码:

思路一:

 class Solution {
public:
long long dfs(vector<int>& nums, long long S, int start)
{
int n = nums.size();
if(start >= n)
return ;
if(start == n-)
{
if(S == nums[start] || S== -nums[start])
{
if(nums[start]==)
return ;
else
return ;
}
else
return ;
}
else
{
long long path1 = dfs(nums, S-nums[start], start+);
long long path2 = dfs(nums, S+nums[start], start+);
return path1+path2;
}
}
int findTargetSumWays(vector<int>& nums, int S) {
if(nums.size()==)
return ;
long long ans = dfs(nums, S, );
return ans;
}
};

思路二:

 class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
if(nums.size()==)
return ;
int pre[], now[];
memset(pre, , sizeof(pre));
memset(now, , sizeof(now));
pre[]=;
for(int i=; i<nums.size(); i++)
{
for(int j=; j<; j++)
{
if(pre[j]!=)
{
now[j+nums[i]] += pre[j];
now[j-nums[i]] += pre[j];
}
}
for(int j=; j<; j++)
{
pre[j] = now[j];
now[j] = ;
}
}
if(S>)
return ;
else
return pre[+S];
}
};

最新文章

  1. dubbox微服务实例及引发的“血案”
  2. 设计模式之行为类模式大PK
  3. 编写CLR存储过程中使用SqlDataRecord
  4. dbcp/c3p0连接池设置mysql会话变量
  5. uboot命令分析+实现【转】
  6. 把自定义类实例存储到LSO
  7. 疑难杂症:NoSuchMethodError: com.opensymphony.xwork2.util.finder.UrlSet.includeClassesUrl(Lcom/opensymphony/xwork2/util/finder/ClassLoaderInterface;)
  8. JavaScript之聊天室设计摸拟
  9. javaweb学习总结十(xml解析&lt;SAX以及DOM方式&gt;)
  10. TC Asia Competition
  11. [C++关键字] alignof &amp; alignas 内存对齐 sizeof 占内存大小
  12. mysql三种binlog日志的理解
  13. java.lang.NoSuchMethodError: main Exception in thread &quot;main&quot;
  14. POJ Oulipo (KMP)
  15. Java数据类型(基本数据类型)学习
  16. CVE-2017-8464复现 (远程快捷方式漏洞)
  17. nginx的autoindex,目录浏览,配置和美化,美观的xslt_stylesheet
  18. 2019新版UI设计面试题汇总(附答案)
  19. 洛谷 P3956 棋盘(BFS)
  20. CMake 示例

热门文章

  1. 2019-08-01 jquery中常用方法
  2. 滥用exchage远程调用域管理员API接口
  3. Cheat Engine 自动注入
  4. nmap的使用方法
  5. c#中的解析HTML组件 -- (HtmlAgilityPack,Jumony,ScrapySharp,NSoup,Fizzler)
  6. javax.persistence.PersistenceException: Unable to build entity manager factory
  7. 项目Beta冲刺(4/7)(追光的人)(2019.5.26)
  8. python应用-猜数字游戏
  9. Spring Cloud Stream 知识点
  10. wordpress站点更换域名了如何快速设置