🧩Algo 动态规划
416. 分割等和子集
难度:🟡 Medium | 标签:动归、0-1 背包 | 状态:⬜ LeetCode 链接
思路
总和奇数直接 false。否则转 0-1 背包:能否从 nums 选出和为 sum / 2?
dp[j] 表示能否凑出和 j。dp[j] = dp[j] || dp[j - nums[i]],j 从大到小(0-1 背包的关键)。
代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for (int x : nums) sum += x;
if (sum % 2) return false;
int target = sum / 2;
vector<char> dp(target + 1, false);
dp[0] = true;
for (int x : nums) {
for (int j = target; j >= x; --j) {
dp[j] = dp[j] || dp[j - x];
}
}
return dp[target];
}
};
复杂度
- 时间 O(n · sum/2),空间 O(sum/2)
易错 / 回顾
- 0-1 背包 j 倒序;完全背包正序
- 总和奇数提前返回
- 进阶:能否拆 K 等份(698 题)→ 状压 DP
Related · 动态规划