
解法一
class Solution { public int findTargetSumWays(int[] nums, int target) { int absSum = 0; for(int num : nums){ absSum += Math.abs(num); } //如果nums中组合出来的最大值absSum < target //那么直接返回0 if(Math.abs(target) > absSum){ return 0; } int n = nums.length; //dp[i][j]表示考虑前i个数字,可以拼凑成数值j的组合方案 int[][] dp = new int[n + 1][2 * absSum + 1]; //如果对nums[]中的元素全部加上负号,则为-absSum,所以我们要做坐标偏移, //且偏移量为absSum //初始化,原本是初始化dp[0][0]=1,现在要加上坐标偏移量 dp[0][0 + absSum] = 1; //状态转移方程 //dp[i][j] = dp[i - 1][j - nums[i]] + dp[i -1][j + nums[i]]; int bias = absSum; for(int i = 1; i <= n; i++){ int val = nums[i - 1]; for(int j = -absSum; j <= absSum; j++){ int case1 = j - val + bias >= 0 ? dp[i - 1][j - val + bias] : 0; int case2 = j + val + bias <= 2 * bias ? dp[i - 1][j + val + bias] : 0; dp[i][j + bias] += case1 + case2; } } return dp[n][target + bias]; }}