知识点
背包问题 DP
思路
首先先对所有的数求和,如果是奇数则不可拆分。
之后需要凑出sum/2的总和,问题转化成有n个数可以选一次或者不选,求出是否能凑出sum/2,则可以用01背包解决。
实现上可以 一维空间优化。
时间复杂度
AC Code(C++)
#include <numeric>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param weights int整型vector
* @return bool布尔型
*/
bool canPartition(vector<int>& weights) {
int sum = accumulate(weights.begin(), weights.end(), 0);
if (sum & 1) return false;
sum >>= 1;
vector<bool> f(sum + 1, false);
f[0] = true;
for (auto x : weights) {
for (int j = sum; j >= x; j --) {
f[j] = (f[j] || f[j - x]);
}
}
return f[sum];
}
};

京公网安备 11010502036488号