题目要求
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.
解题思路
这个问题,只要我们稍微做一下转化,它其实是一个背包问题。
问题要我们判断,一个数列是否能被分为总和相等的两个部分,换一句话说,我们能否从数列中取出一些数字,使这些数字的和是数列总和的一半。这样就把原问题转化成了一个背包问题。
我们使用一个二位bool数组a[i][j]
来表示前i
个数字是否能组成和j
。那么可以得到状态转移方程:
if(j-nums[i-1]>=0):
a[i][j] = a[i-1][j]||a[i-1][j-nums[i-1]]
实际上,使用一维的数组也可以实现我们的算法,具体代码如下。
代码实现
class Solution {
public:
bool canPartition(vector<int>& nums) {
bool a[30000];
a[0] = true;
int sum = 0;
for(int i = 0;i<nums.size();i++){
sum+=nums[i];
}
if(sum % 2 != 0) return false;
sum = sum/2;
for(int i = 1;i<=sum;i++) a[i] = false;
for(int i = 1;i<=nums.size();i++){
for(int j = sum;j>=0;j--){
if(j-nums[i-1]>=0) a[j] = a[j]||a[j-nums[i-1]];
}
}
return a[sum];
}
};
复杂度分析
该算法的复杂度应该是O(n^2)的。