Target Sum问题及解法

来源:互联网 发布:聚合数据 什么公司的 编辑:程序博客网 时间:2024/05/18 00:54

问题描述:

You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symbols + and -. For each integer, you should choose one from + and - as its new symbol.

Find out how many ways to assign symbols to make sum of integers equal to target S.

示例:

Input: nums is [1, 1, 1, 1, 1], S is 3. Output: 5Explanation: -1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3There are 5 ways to assign symbols to make the sum of nums be target 3.

Note:

  1. The length of the given array is positive and will not exceed 20.
  2. The sum of elements in the given array will not exceed 1000.
  3. Your output answer is guaranteed to be fitted in a 32-bit integer.

问题分析:

根据题意,数组nums的和的范围在[-sum,sum](sum为所有元素之和)之中,所以我们可以利用动态规划求解,将[-sum,sum]中的值映射到[0,2 * sum]上,则新dp[j + nums[i]] += 旧dp[j], 新dp[j - nums[i]] += 旧dp[j], j 表示元素和,nums[i]表示第i个元素的值。


过程详见代码:

class Solution {public:    int findTargetSumWays(vector<int>& nums, int S) {int sum = 0;for (auto i : nums) sum += i;vector<int> dp(2 * sum + 1, 0);if (S > sum || S < -sum || nums.empty()) return 0;dp[sum] = 1;for (int i = 0; i < nums.size(); i++){vector<int> temp(2*sum + 1, 0);for (int j = 0; j < 2 * sum + 1; j++){                if(dp[j])                {                    temp[j + nums[i]] += dp[j];                    temp[j - nums[i]] += dp[j];                }}dp = temp;}return dp[sum + S];}};


原创粉丝点击