题目
- 给一个只包含正整数的非空数组,返回是否可以将数组划分为两个子集,使得两个子集的 sum 相等
思路
- 先用了 backtracing 回溯,TLE 了
- DP 的公式,是用当前 num,可以达到的 sum 合标记为 true,注意 num 只可以使用一次
- 初始化 dp[0] 为 true,其余为 false
代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for (auto num : nums) {
sum += num;
}
if (sum & 1)
return false;
sum /= 2;
vector<bool> dp(sum + 1);
dp[0] = true;
for (auto num : nums) {
for (int i = sum; i >= num; i--) {
if (dp[i - num]) {
dp[i] = true;
}
}
}
return dp[sum];
}
};