给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S
现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
方法1:暴力法
方法2:动态规划DP
//方法1
public static int findTargetSumWays(int[] nums,int S){
return dfs(nums,0,0,S);
}
public static int dfs(int[] nums,int pos,int sum,int S){
if(pos==nums.length){
if(sum==S){
return 1;
}else{
return 0;
}
}else{
return dfs(nums,pos+1,sum+nums[pos],S)+dfs(nums,pos+1,sum-nums[pos],S);
}
}
//方法2
public static int dp(int[] nums,int S){
int sum = 0;
int len = nums.length;
for(int i:nums){
sum+=i;
}
if(S>sum){
return 0;
}
int[][] dp = new int[len+1][2*sum+1];
dp[0][sum]=1;
for(int i=1;i<=len;i++){
for(int j=0;j<=2*sum;j++){
if(j-nums[i-1]>=0){
dp[i][j]+=dp[i-1][j-nums[i-1]];
}
if(j+nums[i-1]<=2*sum){
dp[i][j]+=dp[i-1][j+nums[i-1]];
}
}
}
return dp[len][S+sum];
}