Target Sum

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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值