https://leetcode.cn/problems/target-sum/
转化过程比较有意思,记录一下
本题的意思就是把数字分为两个集合,一个赋加号,一个赋减号,这里不妨设为 l e f t left left 和 r i g h t right right 集合
由题,
- l e f t + r i g h t = s u m left+right=sum left+right=sum
- l e f t − r i g h t = t a r g e t left-right=target left−right=target
可以推出 l e f t = ( t a r g e t + s u m ) / 2 left = (target + sum)/2 left=(target+sum)/2
也就是从整个集合中找出和为 l e f t left left 的组合数
完整代码
class Solution {
public int findTargetSumWays(int[] nums, int target) {
int length = nums.length;
int sum=0;
for(int i=0;i<length;i++) sum+=nums[i];
if((sum+target)%2==1 || Math.abs(target)>sum) return 0;
int pos = (sum+target)/2;
int[] dp = new int[pos+1];
dp[0]=1;
if(nums[0]<=pos) dp[nums[0]]+=1;
for(int i=1;i<length;i++){
for(int j=pos;j>=nums[i];j--){
dp[j]=dp[j]+dp[j-nums[i]];
}
}
return dp[pos];
}
}