题目:判断一个数组是否能被拆分成两个子数组,使得这两个子数组各自的数字和相等。
方案:回溯法
问题:很容易超时。如果从小到大排序会超时,只有从大到小排序才可以。
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int i = 0; i < nums.size(); ++i){
sum += nums[i];
}
if(sum%2 == 1){ // 和为奇数,则不可能实现
return false;
}
int target = sum/2;
sort(nums.begin(), nums.end(), [] (int a, int b){return a > b;}); // 这一步很重要
if(nums[0] > target){
return false;
}
else if(nums[0] == target){
return true;
}
else target -= nums[0];
return backtrack(nums, target, 1);
}
private:
bool backtrack(vector<int>& nums, int target, int start){
if(target == 0){
return true;
}
if(target < 0){
return false;
}
if(start >= nums.size()){
return false;
}
bool b1 = backtrack(nums, target - nums[start], start + 1); // nums[start]放入
if(b1)
return b1;
bool b2 = backtrack(nums, target, start + 1); // nums[start]不放入;
return b2;
}
};