LeetCode 494. Target Sum

Posted rocklamighty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 494. Target Sum相关的知识,希望对你有一定的参考价值。

作为一个超级小白,最近开始寻找互联网公司的就业机会,可是无奈代码关难过。于是最近开始刷LeetCode上的习题。

这道题其实可以转换为典型的动态规划01背包问题。它的描述如下:

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:

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.

 

首先,要知道这道题的状态转移方程。根据题中的表述可知状态转移方程为:

F(i, v) = F(i-1, v+ci) + F(i-1, v-ci)

其中F(i,v)表示前i个数能组成值为v的组合数,ci为第i个数的值。

 

下面是我的代码解答:

int findTargetSumWays(vector<int>& nums, int S) {
    int numsSum = accumulate(nums.begin(), nums.end(), 0);
    if(S>numsSum||S<-numsSum) return 0;
    int target = S + numsSum;
    vector<int> vec(target+1, 0);
    vec[0] = 1;
    vec[2*nums[0]] += 1;
    int n = nums.size();
    for (int i = 1; i < n; i++){
        for (int j = target; j >=0; j--){
            vec[j] = j - 2 * nums[i] >= 0 ? vec[j] + vec[j - 2 * nums[i]] : vec[j];
        }
    }
    return vec[target];
}

 

以上是关于LeetCode 494. Target Sum的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 494: Target Sum

LeetCode 494. Target Sum

[leetcode-494-Target Sum]

LeetCode 494. Target Sum

leetcode494 - Target Sum - medium

LeetCode 494. Target Sum