classSolution{public:intfindTargetSumWays(vector<int>&nums,inttarget){constintsum=accumulate(begin(nums),end(nums),0);if(sum<abs(target)||(sum+target)&1)return0;returnknapsack(nums,(sum+target)/2);}private:intknapsack(constvector<int>&nums,inttarget){constintn=nums.size();// dp[i][j] := # of ways to sum to j by nums[0..i)vector<vector<int>>dp(n+1,vector<int>(target+1));dp[0][0]=1;for(inti=1;i<=n;++i){constintnum=nums[i-1];for(intj=0;j<=target;++j)if(j<num)dp[i][j]=dp[i-1][j];elsedp[i][j]=dp[i-1][j]+dp[i-1][j-num];}returndp[n][target];}};
classSolution{publicintfindTargetSumWays(int[]nums,inttarget){finalintsum=Arrays.stream(nums).sum();if(sum<Math.abs(target)||(sum+target)%2==1)return0;returnknapsack(nums,(sum+target)/2);}privateintknapsack(int[]nums,inttarget){finalintn=nums.length;// dp[i][j] := # of ways to sum to j by nums[0..i)int[][]dp=newint[n+1][target+1];dp[0][0]=1;for(inti=1;i<=n;++i){finalintnum=nums[i-1];for(intj=0;j<=target;++j)if(j<num)dp[i][j]=dp[i-1][j];elsedp[i][j]=dp[i-1][j]+dp[i-1][j-num];}returndp[n][target];}}
classSolution:deffindTargetSumWays(self,nums:List[int],target:int)->int:summ=sum(nums)ifsumm<abs(target)or(summ+target)&1:return0defknapsack(target:int)->int:# dp[i] := # Of ways to sum to i by nums so fardp=[1]+[0]*summfornuminnums:forjinrange(summ,num-1,-1):dp[j]+=dp[j-num]returndp[target]returnknapsack((summ+target)//2)