1、題目html
一、審題 數組
二、分析spa
給出一個正整數數組。爲每一個元素添加 + 、- 符號,而後將元素相加,求共有多少種組合使得和爲 S;code
2、解答htm
方法1、blog
① 將此問題轉化爲取數組中若干元素,使得元素和爲某必定值的問題:get
假設正數集合爲 P, 負數集合爲 N;則有:class
sum[P] - sum[N] = S方法
sum[P] + sum[N] + sum[P] - sum[N] = S + sum[nums]im
即:
sum[P] = (S + sum[nums]) / 2
② 求若干元素和爲特定值解法爲: http://www.javashuo.com/article/p-totudbmk-gp.html
③ 採用一維整形動態數組: dp[s + 1]。 其中 dp[i]: 表示數組 nums 中元素隨意組合和 爲 i 的組合個數。
④ 最終返回 dp[s]
public int findTargetSumWays(int[] nums, int s) { int sum = 0; for(int n : nums) sum += n; if(sum < s || (s + sum) % 2 == 1) return 0; return subsetSum(nums, (s + sum) >>> 1); } private int subsetSum(int[] nums, int s) { int[] dp = new int[s + 1]; dp[0] = 1; // 在 nums 中取若干個元素求和,和爲 0 的組合共 1 個 for(int n: nums) { for (int i = s; i >= n; i--) { dp[i] += dp[i - n]; } } return dp[s]; }