思路
- 这个题目首先在于转化,把题目转化为从数组中选出一些数,使他们的和为 sum+target >> 1
- 设f(i,j)为前i个元素可以选出和为j的子元素的选法
- 如果不选择第i个 f(i,j) = f(i-1,j)
- 如果选择第i个 f(i,j) = f(i-1,j-nums[j])
class Solution {
public int findTargetSumWays(int[] nums, int target) {
int sum = Arrays.stream(nums).sum() , aim = target + sum >> 1 ;
if(sum < target || 1 == (target + sum & 1))
return 0;
int[] dp = new int[aim+1];
dp[0] = 1;
for(int i = 0 ; i < nums.length ; i++){
for(int j = aim ; j >= nums[i] ; j--){
dp[j] += dp[j-nums[i]];
}
}
return dp[aim];
}
}