leetcode-494. Target Sum

来源:互联网 发布:jquery定义json对象 编辑:程序博客网 时间:2024/05/20 20:47

考察dp,DFS;
思路:DFS简单,但是时间耗费多;DP算法中,dp[i][j]表示的是前i个数表示总数j的所有可能。运用数组下标映射算法。

C++代码:
DFS:

class Solution {public:    int ret;    int findTargetSumWays(vector<int>& nums, int S) {        ret = 0;        int len = nums.size();        if (len == 0)            return ret;        dfs(nums, 0, 0, S);        return ret;    }    void dfs(vector<int> &nums, int cur, int sum, int target) {        if (cur == nums.size()) {            if (sum == target) {                ret++;                return;            } else {                return;            }        }        dfs(nums, cur+1, sum+nums[cur], target);        dfs(nums, cur+1, sum-nums[cur], target);    }};

DP:

//DPclass Solution {public:    int dp[21][2002];    int findTargetSumWays(vector<int>& nums, int S) {        memset(dp, 0, sizeof(dp));        int len = nums.size();        int sum = 0;        for (int i : nums)            sum+=i;        dp[0][1000] = 1;        if (S<(-sum) || S>sum)            return 0;        for (int i=1; i<=len; i++) {            for (int j = 1000-sum; j<=1000 + sum; j++) {                if (dp[i-1][j] != 0) {                    //cout<<dp[i-1][j]<<" j="<<j<<" i="<<i<<endl;                    dp[i][j - nums[i-1]] += dp[i-1][j];                    dp[i][j + nums[i-1]] += dp[i-1][j];                }            }        }        return dp[len][S+1000];    }};
0 0