Target Sum

来源:互联网 发布:淘宝下架宝贝怎么删除 编辑:程序博客网 时间:2024/05/22 05:56

Descpition:
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.

Example 1:
Input: nums is [1, 1, 1, 1, 1], S is 3.
Output: 5
Explanation:

-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 = 3

There are 5 ways to assign symbols to make the sum of nums be target 3.
Note:
The length of the given array is positive and will not exceed 20.
The sum of elements in the given array will not exceed 1000.
Your output answer is guaranteed to be fitted in a 32-bit integer.

解题思路:因为要找出所有满足运算后的结果等于给定数值的方法,所以可以使用dfs的思想来算出所有的结果,再把结果跟给定数值比较。之所以用dfs是因为我们可以想象出一棵树,树的每个节点带有一个数值,根节点的数值为0,根节点的左子节点与右子节点互为相反数,绝对值等于数组中的第一个元素的绝对值。示意图如下:
以数组[1,2]为例
但我们用不着去建立一棵树,只需要借鉴dfs的思想即可,程序如下:

class Solution {public:    int findTargetSumWays(vector<int>& nums, int S) {        dfs(nums, 0, 0, S);        return count;    }private:    int count = 0; //记录数目    void dfs(vector<int>&nums, int level, int sum, int target) { //level表示访问到了第几层,sum记录和        if (level >= nums.size()) {            if (sum == target)                count++;            return;        }        int sum1 = sum;        int sum2 = sum;        sum1 += nums[level];        sum2 -= nums[level];        dfs(nums, level + 1, sum1, target); //进行下一层的dfs        dfs(nums, level + 1, sum2, target);    }};
0 0