classSolution { public: intfindTargetSumWays(vector<int>& nums, int S){ vector<vector<int> >dp(30,vector<int>(5000)); int len = nums.size(); int sum = 0; for(int i = 0 ;i < len ; i++)//预先算一下最大跑到的值和最小跑到的值 sum+=abs(nums[i]); if(S > sum || S < -sum)//超出范围直接返回 return0; dp[0][nums[0]+2000]=1;//初始化,+2000是因为题目说了加和最大值不超过1000 dp[0][-nums[0]+2000]+=1;//可能有0的情况,所以是+= for(int i = 1 ; i < len ; i++) for(int j = -sum ; j <= sum ; j++) dp[i][j+2000] = dp[i-1][j-nums[i]+2000]+dp[i-1][j+nums[i]+2000]; return dp[len-1][S+2000]; } };