<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>target Archives - Huahua&#039;s Tech Road</title>
	<atom:link href="https://zxi.mytechroad.com/blog/tag/target/feed/" rel="self" type="application/rss+xml" />
	<link>https://zxi.mytechroad.com/blog/tag/target/</link>
	<description></description>
	<lastBuildDate>Tue, 04 Sep 2018 05:17:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.8</generator>

<image>
	<url>https://zxi.mytechroad.com/blog/wp-content/uploads/2017/09/cropped-photo-32x32.jpg</url>
	<title>target Archives - Huahua&#039;s Tech Road</title>
	<link>https://zxi.mytechroad.com/blog/tag/target/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>花花酱 LeetCode 494. Target Sum</title>
		<link>https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-494-target-sum/</link>
					<comments>https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-494-target-sum/#respond</comments>
		
		<dc:creator><![CDATA[zxi]]></dc:creator>
		<pubDate>Wed, 10 Jan 2018 06:13:49 +0000</pubDate>
				<category><![CDATA[Dynamic Programming]]></category>
		<category><![CDATA[Medium]]></category>
		<category><![CDATA[combination]]></category>
		<category><![CDATA[DFS]]></category>
		<category><![CDATA[sum]]></category>
		<category><![CDATA[target]]></category>
		<guid isPermaLink="false">http://zxi.mytechroad.com/blog/?p=1587</guid>

					<description><![CDATA[<p>题目大意：给你一串数字，你可以在每个数字前放置+或-，问有多少种方法可以使得表达式的值等于target。You are given a list of non-negative integers, a1, a2, &#8230;, an, and a target, S. Now you have 2 symbols + and -. For each integer, you&#8230;</p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-494-target-sum/">花花酱 LeetCode 494. Target Sum</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><iframe width="500" height="375" src="https://www.youtube.com/embed/r6Wz4W1TbuI?feature=oembed" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></p>
<p><iframe width="500" height="375" src="https://www.youtube.com/embed/zks6mN06xdQ?feature=oembed" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></p>
<p>题目大意：给你一串数字，你可以在每个数字前放置+或-，问有多少种方法可以使得表达式的值等于target。You are given a list of non-negative integers, a1, a2, &#8230;, an, and a target, S. Now you have 2 symbols <code>+</code> and <code>-</code>. For each integer, you should choose one from <code>+</code> and <code>-</code> as its new symbol.</p>
<p>Find out how many ways to assign symbols to make sum of integers equal to target S.</p>
<p><b>Example 1:</b></p><pre class="crayon-plain-tag">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 = 3

There are 5 ways to assign symbols to make the sum of nums be target 3.</pre><p><b>Note:</b></p>
<ol>
<li>The length of the given array is positive and will not exceed 20.</li>
<li>The sum of elements in the given array will not exceed 1000.</li>
<li>Your output answer is guaranteed to be fitted in a 32-bit integer.</li>
</ol>
<p><ins class="adsbygoogle" style="display: block; text-align: center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-2404451723245401" data-ad-slot="7983117522"> </ins></p>
<h1><strong>Idea: DP</strong></h1>
<p><img class="alignnone size-full wp-image-1598" src="http://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-2.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-2.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-2-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-2-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-1599" src="http://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-1.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-1.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-1-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-1-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-1597" src="http://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-3.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-3.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-3-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-3-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-1609" src="http://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-4.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-4.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-4-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-4-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-1608" src="http://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-5.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-5.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-5-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-5-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-1607" src="http://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-6.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-6.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-6-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-6-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><img class="alignnone size-full wp-image-1606" src="http://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-7.png" alt="" width="960" height="540" srcset="https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-7.png 960w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-7-300x169.png 300w, https://zxi.mytechroad.com/blog/wp-content/uploads/2018/01/494-ep156-7-768x432.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p><ins class="adsbygoogle" style="display: block; text-align: center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-2404451723245401" data-ad-slot="7983117522"><br />
</ins></p>
<h1><strong>Solution 1: DP</strong></h1>
<p>Time complexity: O(n*sum)</p>
<p>Space complexity: O(n*sum)</p>
<p><div class="responsive-tabs">
<h2 class="tabtitle">C++</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 16 ms
class Solution {
public:
    int findTargetSumWays(vector&lt;int&gt;&amp; nums, int S) {
      const int n = nums.size();
      const int sum = std::accumulate(nums.begin(), nums.end(), 0);
      if (sum &lt; S) return 0;
      const int offset = sum;
      // ways[i][j] means total ways to sum up to (j - offset) using nums[0] ~ nums[i - 1].
      vector&lt;vector&lt;int&gt;&gt; ways(n + 1, vector&lt;int&gt;(sum + offset + 1, 0));
      ways[0][offset] = 1;
      for (int i = 0; i &lt; n; ++i) {
        for (int j = nums[i]; j &lt; 2 * sum + 1 - nums[i]; ++j)
          if (ways[i][j]) {
            ways[i + 1][j + nums[i]] += ways[i][j];
            ways[i + 1][j - nums[i]] += ways[i][j];
          }        
      }
      
      return ways.back()[S + offset];
    }
};</pre><p></div><h2 class="tabtitle">C++ SC O(n)</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 12 ms
class Solution {
public:
    int findTargetSumWays(vector&lt;int&gt;&amp; nums, int S) {
      const int n = nums.size();
      const int sum = std::accumulate(nums.begin(), nums.end(), 0);
      if (sum &lt; std::abs(S)) return 0;
      const int kOffset = sum;
      const int kMaxN = sum * 2 + 1;
      vector&lt;int&gt; ways(kMaxN, 0);      
      ways[kOffset] = 1;
      for (int num : nums) {
        vector&lt;int&gt; tmp(kMaxN, 0);
        for (int i = num; i &lt; kMaxN - num; ++i)
          if (ways[i]) {
            tmp[i + num] += ways[i];
            tmp[i - num] += ways[i];
          }
        std::swap(ways, tmp);
      }      
      return ways[S + kOffset];
    }
};</pre><p></div><h2 class="tabtitle">Java</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 28 ms
class Solution {
  public int findTargetSumWays(int[] nums, int S) {
    int sum = 0;
    for (final int num : nums)
      sum += num;
    if (sum &lt; S) return 0;
    final int kOffset = sum;
    final int kMaxN = sum * 2 + 1;
    int[] ways = new int[kMaxN];
    ways[kOffset] = 1;
    for (final int num : nums) {      
      int[] tmp = new int[kMaxN];      
      for (int i = num; i &lt; kMaxN - num; ++i) {
        tmp[i + num] += ways[i];
        tmp[i - num] += ways[i];
      }
      ways = tmp;
    }
    return ways[S + kOffset];
  }
}</pre><p></div><h2 class="tabtitle">C++ / V2</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 17 ms
class Solution {
public:
    int findTargetSumWays(vector&lt;int&gt;&amp; nums, int S) {
      const int n = nums.size();
      const int sum = std::accumulate(nums.begin(), nums.end(), 0);
      if (sum &lt; std::abs(S)) return 0;
      const int kOffset = sum;
      const int kMaxN = sum * 2 + 1;
      vector&lt;int&gt; ways(kMaxN, 0);      
      ways[kOffset] = 1;
      for (int num : nums) {
        vector&lt;int&gt; tmp(kMaxN, 0);
        for (int i = 0; i &lt; kMaxN; ++i) {
          if (i + num &lt; kMaxN) tmp[i] += ways[i + num];
          if (i - num &gt;= 0)    tmp[i] += ways[i - num];
        }
        std::swap(ways, tmp);
      }
      return ways[S + kOffset];
    }
};</pre><p></div></div></p>
<h1><strong>Solution 2: DFS</strong></h1>
<p>Time complexity: O(2^n)</p>
<p>Space complexity: O(n)</p>
<p><div class="responsive-tabs">
<h2 class="tabtitle">C++</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 422 ms
class Solution {
public:
  int findTargetSumWays(vector&lt;int&gt;&amp; nums, int S) {
    const int sum = std::accumulate(nums.begin(), nums.end(), 0);
    if (sum &lt; std::abs(S)) return 0;
    int ans = 0;
    dfs(nums, 0, S, ans);
    return ans;
  }
private:
  void dfs(const vector&lt;int&gt;&amp; nums, int d, int S, int&amp; ans) {
    if (d == nums.size()) {
      if (S == 0) ++ans;
      return;
    }    
    dfs(nums, d + 1, S - nums[d], ans);
    dfs(nums, d + 1, S + nums[d], ans);
  }
};</pre><p></div><h2 class="tabtitle">Java</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 615 ms
class Solution {
  private int ans;
  public int findTargetSumWays(int[] nums, int S) {
    int sum = 0;
    for (final int num : nums)
      sum += num;
    if (sum &lt; Math.abs(S)) return 0;
    ans = 0;
    dfs(nums, 0, S);
    return ans;
  }
  
  private void dfs(int[] nums, int d, int S) {
    if (d == nums.length) {
      if (S == 0) ++ans;
      return;
    }
    dfs(nums, d + 1, S - nums[d]);
    dfs(nums, d + 1, S + nums[d]);
  }
}</pre><p></div></div></p>
<h1><strong>Solution 3: Subset sum</strong></h1>
<p>Time complexity: O(n*sum)</p>
<p>Space complexity: O(sum)</p>
<p><div class="responsive-tabs">
<h2 class="tabtitle">C++ w/ copy</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 7 ms
class Solution {
public:
    int findTargetSumWays(vector&lt;int&gt;&amp; nums, int S) {
      S = std::abs(S);      
      const int sum = std::accumulate(nums.begin(), nums.end(), 0);
      if (sum &lt; S || (S + sum) % 2 != 0) return 0;
      const int target = (S + sum) / 2;
      vector&lt;int&gt; dp(target + 1, 0);
      dp[0] = 1;
      for (int num : nums) {
        vector&lt;int&gt; tmp(dp);
        for (int j = 0; j &lt;= target - num; ++j)
          tmp[j + num] += dp[j];
        std::swap(dp, tmp);
      }
      
      return dp[target];
    }
};</pre><p></div><h2 class="tabtitle">C++  w/o copy</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 6 ms
class Solution {
public:
    int findTargetSumWays(vector&lt;int&gt;&amp; nums, int S) {
      S = std::abs(S);
      const int n = nums.size();
      const int sum = std::accumulate(nums.begin(), nums.end(), 0);
      if (sum &lt; S || (S + sum) % 2 != 0) return 0;
      const int target = (S + sum) / 2;
      vector&lt;int&gt; dp(target + 1, 0);
      dp[0] = 1;
      for (int num : nums)
        for (int j = target; j &gt;= num; --j)
          dp[j] += dp[j - num];
      
      return dp[target];
    }
};</pre><p></div></div></p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-494-target-sum/">花花酱 LeetCode 494. Target Sum</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-494-target-sum/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
