#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
// 判断能否分割成两个子集,返回是或否
bool canPartition(vector<int>& nums) {
// 初始化dp数组
vector<int> dp(10001, 0);
int sum = 0;
// 找到背包容量
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
// 或者用库函数求和,头两个形参指定要累加的元素范围,第三个形参则是累加的初值
// #include <numeric>
// int sum = accumulate(nums.begin(), nums.end(), 0);
// 如果sum和是奇数,那么一定不能分成两个等和子集,直接返回false
if (sum % 2 == 1) return false;
int target = sum / 2;
// 先遍历物品,再倒序遍历背包
for (int i = 0; i < nums.size(); i++) {
// 每一个元素一定是不可重复放入,所以从大到小遍历
for (int j = target; j >= nums[i]; j--) {
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
// 集合中的元素正好可以凑成总和target
if (dp[target] == target) return true;
return false;
}
};
int main() {
vector<int> nums = {1, 5, 11, 6};
Solution solution;
bool b = solution.canPartition(nums);
// cout << b << endl;
printf(b == true ? "true" : "false");
return 0;
}
力扣416. 分割等和子集[CPP]
最新推荐文章于 2024-08-25 17:36:33 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)