力扣 416. 分割等和子集

45 阅读1分钟

🔗 leetcode.cn/problems/pa…

题目

  • 给一个只包含正整数的非空数组,返回是否可以将数组划分为两个子集,使得两个子集的 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];
    }
    };