**思路:**可以转换以下思路
- 先求出数组的总和 sum
- 然后选定几个数的和为neq,得到关系 neq+target = sum-neq
- 所以neq = (sum-target)/2;
题目就可以转为中数组中选择几个数,和为neq;
使用动态规划来解决这个问题:
dp[i][j]表示从前i个数里面选择后得到总和为j的个数。
代码
class Solution {
//可以使用0-1背包问题解决
public int findTargetSumWays(int[] nums, int target) {
int sum = 0;
for (int num : nums) {
sum += num;
}
if(sum<target || (sum-target)%2!=0) return 0;
int neq = (sum - target) / 2;
//dp[i][j]表示从前i中选取的和为j的 方案数
int[][] dp = new int[nums.length + 1][neq + 1];
dp[0][0] = 1;
for(int i=1;i<dp.length;i++){
for(int j=0;j<dp[0].length;j++){
//从上一步得到的结果
dp[i][j]+= dp[i-1][j];
//j-nums[i-1] >=0 ,满足状态,更新dp[i][j]
if(j-nums[i-1]>=0){
dp[i][j]+=dp[i-1][j-nums[i-1]];
}
}
}
return dp[dp.length-1][neq];
}
}