这题最主要的是要用target求出前面为 ‘ - ’ 的数的和或者前面为‘ + ’的数的和,不然如果想用动态规划来解决的话没法确定列有多大,因此没法创建数组。
设前面为 ‘ - ’ 的数的和negNums,前面为‘ + ’的数的和posNums,sum为nums数组的和,negNums+posNums=sum,-negNums+posNums=target,因此posNums=(sum+target)/2,动态规划数组的列大小也可以确定下来。
class Solution {
public int findTargetSumWays(int[] nums, int target) {
int sum=0;
for (int num:nums)
{
sum+=num;
}
if ((sum+target)%2!=0||sum+target<0)return 0;
int posNums=(sum+target)/2;
int[][] dp=new int[nums.length+1][posNums+1];
dp[0][0]=1;
for (int i=1;i<=nums.length;i++)
{
for (int j=0;j<=posNums;j++)
{
dp[i][j]=dp[i-1][j];
if (j>=nums[i-1])
{
dp[i][j]+=dp[i-1][j-nums[i-1]];
}
}
}
return dp[nums.length][posNums];
}
}