[leetcode] 416. Partition Equal Subset Sum 解题报告

来源:互联网 发布:虚拟机 ubuntu 屏幕 编辑:程序博客网 时间:2024/04/30 07:43

题目链接:https://leetcode.com/problems/partition-equal-subset-sum/

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:
Both the array size and each of the array element will not exceed 100.

Example 1:

Input: [1, 5, 11, 5]Output: trueExplanation: The array can be partitioned as [1, 5, 5] and [11].

Example 2:

Input: [1, 2, 3, 5]Output: falseExplanation: The array cannot be partitioned into equal sum subsets

思路:一个背包的题目,背包容量为数组中元素和的一半+1,这样只要看是否有元素可以正好填满背包即可.但是每个元素只能用一次,所以在尝试放一个元素的时候还要避免他对尝试放其他位置时对自己的影响.所以在尝试放一个元素到背包的时候需要从容量最大的位置开始,如果(当前位置-当前元素大小)位置可以通过放置之前的元素达到,则当前位置也可以通过放置当前元素正好达到这个位置.状态转移方程为:dp[i] = dp[i] || dp[i - nums[k]];

代码如下:

class Solution {public:    bool canPartition(vector<int>& nums) {        int sum = accumulate(nums.begin(), nums.end(), 0);        if(sum&1) return false;        vector<int> dp(sum/2+1, 0);        for(int i = 0, dp[0] = 1; i < nums.size(); i++)        {            for(int j = sum/2; j >= nums[i]; j--)                dp[j] = dp[j] || dp[j-nums[i]];        }        return dp[sum/2];    }};



0 0
原创粉丝点击