494. Target Sum
题目描述: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 = 3 There are 5 ways to assign symbols to make the sum of nums be target 3.
题目大意:给定一个数组nums,给定一个target,问数组中的数有多少种方式可以通过+-,得到target。
思路:给定一个数组nums=[1,2,3,4,5],target=3,一个可能的解是+1-2+3-4+5 = 3.解中的正数子集
P = [1, 3, 5]
负数子集N = [2, 4]
,可得sum(P) - sum(N) = target,两边同时加sum(P) + sum(N),sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N),简化得 2 * sum(P) = target + sum(nums),sum(P) = (target + sum(nums)) / 2。代码
package DP; /** * @author OovEver * 2017/12/25 10:21 */ public class LeetCode494 { public int findTargetSumWays(int[] nums, int S) { int sum = 0; for (int n : nums) { sum += n; } if (sum < S || (S + sum) % 2 > 0) { return 0; } return subsetSum(nums, (sum + S) / 2); } public int subsetSum(int[] nums, int s) { int[] dp = new int[s + 1]; dp[0] = 1; for (int n : nums) { for(int i=s;i>=n;i--) { dp[i] += dp[i - n]; } } return dp[s]; } }