一、题目内容
二、DFS做法
//记录解法数量
int count=0;
public int findTargetSumWays(int[] nums, int target) {
dfs(nums,target,0);
return count;
}
private void dfs(int[] nums, int target,int index) {
//如果当前树的深度等于nums数组的长度,说明已经遍历完了
if(index==nums.length)
//如果此时target等于0,那么就说明出现了一种判断方法
if(target==0)
{
count++;
return;
}
//递归调用nums[index]是减号的情况
if(index<nums.length){
dfs(nums,target-nums[index],index+1);
}
//递归调用nums[index]是加号的情况
if(index<nums.length){
dfs(nums,target+nums[index],index+1);
}
三、动态规划做法
public int findTargetSumWays(int[] nums, int target) {
int sum=0;
for(int i:nums)
sum+=i;
if (sum < target || ((sum - target) & 1) != 0)
return 0;
int cap=(sum-target)/2;
int [][]dp=new int [nums.length+1][cap+1];
dp[0][0]=1;
for(int i=1;i<=nums.length;i++)
{
for(int j=0;j<=cap;j++)
{
if(nums[i-1]>j)
dp[i][j]=dp[i-1][j];
else
dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]];
}
}
return dp[nums.length][cap];
}