您的位置:首页 > 其它

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:
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
解法二没看  被放鸽子 没心情
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: