leetcode--- Partition Equal Subset Sum---动规

来源:互联网 发布:投影仪测试软件 编辑:程序博客网 时间:2024/05/21 03:54

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

Note:
Each of the array element will not exceed 100.
The array size will not exceed 200.
Example 1:

Input: [1, 5, 11, 5]

Output: true

Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:

Input: [1, 2, 3, 5]

Output: false

Explanation: The array cannot be partitioned into equal sum subsets.

class Solution{public:    bool dp[10000];    bool vis[200];    bool canPartition(vector<int>& nums)     {        int s = 0;        for(int i=0; i<nums.size(); i++)            s += nums[i];        if(s % 2 != 0)            return false;        memset(dp, false, sizeof(dp));        dp[0] = true;        for(int j=0; j<nums.size(); j++)        {            for(int i=s/2; i>=nums[j]; i--)                dp[i] = dp[i] || dp[i-nums[j]];        }        return dp[s/2];    }};

回溯—超时

class Solution{public:    bool vis[200];    bool dfs(vector<int>&nums, int dep, int tmp, int s)    {        if(tmp == s)        {            cout << tmp << " ";            return true;        }        else        {            for(int i=dep; i<nums.size(); i++)            {                if(tmp + nums[i] <= s)                {                    if(dfs(nums, i+1, tmp + nums[i], s))                        return true;                }            }            return false;        }    }    bool canPartition(vector<int>& nums)     {        int s = 0;        for(int i=0; i<nums.size(); i++)            s += nums[i];        if(s % 2 != 0)            return false;        memset(vis, false, sizeof(vis));        int tmp = 0;        int dep = 0;        return dfs(nums, dep, tmp, s/2);    }};
0 0