问题描述:
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.
给一个非空正整数数组,返回是否可以分成两个和相等的子数组
问题解决:
定义数组a[len+1][sum/2+1],其中len表示原数组长度,sum表示原数组中数的和,a[i][j]表示数组前i个数是否可以刚好凑出j
其中a[0][0]为true
找出递推式
a[i][j] = a[i-1][j-sum[i-1]] || a[i-1][j]
代码如下:
class Solution {
public:
bool canPartition(vector<int>& nums) {
int i, j;
int len = nums.size();
int sum = 0;
//算出原数组和
for(i = 0; i < len; i++) {
sum += nums[i];
}
//设置a并初始化
bool a[len+1][sum/2+1];
for(i = 0; i <= len; i++) {
for(j = 0; j <= sum/2; j++) {
a[i][j] = false;
}
}
a[0][0] = true;
for(i = 1; i <= len; i++) {
for(j = 0; j <= sum/2; j++) {
//根据递推式算出a[i][j]
if(a[i-1][j]) a[i][j] = a[i-1][j];
else {
if(j >= nums[i-1]) a[i][j] = a[i-1][j-nums[i-1]];
}
}
}
//若原数组总和为奇数,返回false
if(sum%2==1) return false;
//否则返回
return a[len][sum/2];
}
};