416. Partition Equal Subset Sum
2016-10-21 22:39
225 查看
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:
Example 2:
写个例子看看 [1,2,3,4,5] 1 2 3 4 5 一定有 if(i==num[j]) dp[i] =true 显然 dp[i-num[j]] =true dp[i]=true 注意遍历的情况
这道题还可以用bitset来做,感觉也十分的巧妙,bisets的大小设为5001,为啥呢,因为题目中说了数组的长度和每个数字的大小都不会超过100,那么最大的和为10000,那么一半就是5000,前面再加上个0,就是5001了。我们初始化把最低位赋值为1,然后我们算出数组之和,然后我们遍历数字,对于遍历到的数字num,我们把bits向左平移num位,然后再或上原来的bits,这样所有的可能出现的和位置上都为1。举个例子来说吧,比如对于数组[2,3]来说,初始化bits为1,然后对于数字2,bits变为101,我们可以看出来bits[2]标记为了1,然后遍历到3,bits变为了101101,我们看到bits[5],bits[3],bits[2]都分别为1了,正好代表了可能的和2,3,5,这样我们遍历玩整个数组后,去看bits[sum
>> 1]是否为1即可,参见代码如下:
解法二:
http://www.cnblogs.com/grandyang/p/5951422.html
解法二没看 被放鸽子 没心情
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.
写个例子看看 [1,2,3,4,5] 1 2 3 4 5 一定有 if(i==num[j]) dp[i] =true 显然 dp[i-num[j]] =true dp[i]=true 注意遍历的情况
public class Solution { public boolean canPartition(int[] nums) { int sum=0; for(int i=0;i<nums.length;i++) sum+=nums[i]; if(sum%2!=0) return false; boolean dp[]=new boolean[sum/2+1]; dp[0]=true; for(int i=0;i<nums.length;i++){ for(int j=sum/2;j>=nums[i];j--){ dp[j]=dp[j]||dp[j-nums[i]]; } } return dp[dp.length-1]; } }
这道题还可以用bitset来做,感觉也十分的巧妙,bisets的大小设为5001,为啥呢,因为题目中说了数组的长度和每个数字的大小都不会超过100,那么最大的和为10000,那么一半就是5000,前面再加上个0,就是5001了。我们初始化把最低位赋值为1,然后我们算出数组之和,然后我们遍历数字,对于遍历到的数字num,我们把bits向左平移num位,然后再或上原来的bits,这样所有的可能出现的和位置上都为1。举个例子来说吧,比如对于数组[2,3]来说,初始化bits为1,然后对于数字2,bits变为101,我们可以看出来bits[2]标记为了1,然后遍历到3,bits变为了101101,我们看到bits[5],bits[3],bits[2]都分别为1了,正好代表了可能的和2,3,5,这样我们遍历玩整个数组后,去看bits[sum
>> 1]是否为1即可,参见代码如下:
解法二:
class Solution { public: bool canPartition(vector<int>& nums) { bitset<5001> bits(1); int sum = accumulate(nums.begin(), nums.end(), 0); for (int num : nums) bits |= bits << num; return (sum % 2 == 0) && bits[sum >> 1]; } };
http://www.cnblogs.com/grandyang/p/5951422.html
解法二没看 被放鸽子 没心情
相关文章推荐
- 416. Partition Equal Subset Sum
- 416. Partition Equal Subset Sum
- 416. Partition Equal Subset Sum
- 每周LeetCode算法题(五):416. Partition Equal Subset Sum
- [LeetCode OJ]Partition Equal Subset Sum
- 416. Partition Equal Subset Sum
- LeetCode No.416 Partition Equal Subset Sum
- Partition Equal Subset Sum
- 【Leetcode】416-Partition Equal Subset Sum -- javascript解法 01背包问题
- LeetCode - 416 - Partition Equal Subset Sum
- Partition Equal Subset Sum问题及解法
- 588 - Partition Equal Subset Sum
- Leetcode: Partition Equal Subset Sum
- Partition Equal Subset Sum解题报告
- 416. Partition Equal Subset Sum
- lintcode: Partition Equal Subset Sum
- [LeetCode] Partition Equal Subset Sum 相同子集和分割
- [LeetCode] 416 Partition Equal Subset Sum
- leetcode解题之416#Partition Equal Subset SumJava版. 对半分(0-1背包,动态规划)
- [Leetcode] #416 Partition Equal Subset Sum