【LeetCode】101. 分割等和子集

剑指 Offer II 101. 分割等和子集

状态:

  • 前x个数
  • 累加和y
  • 值: 前x 个数是否可以凑出 累加和为y <\bool>
bool canPartition(vector<int> nums) {
    int sum =0;
    int n = nums.size();
    for(int item : nums) sum += item;
    if(sum % 2 == 1) return false;
    int target = sum / 2;
    /*
        dp: 
            - x:  前 s 个 数
            - y:  和 i 
            - v:  bool 是否能够 使用前 s 个 数达到 i
    */
    vector<vector<bool>> dp(target + 1, vector<bool>(n + 1, false));
    //  bad case [0][] 和为0 的数都为true 
    for(int x = 0;x <= n; ++x){
        dp[0][x] = true;
    }

    for(int y = 1; y <= target; ++y) {
        for(int x = 1; x<= nums.size(); ++x) {
            if(y < nums[x-1]) {
                // 目标的和 小于当前值时,看前一个是否已经满足
                dp[y][x] = dp[y][x-1];
            } else {
                // 目标的和 大于当前值,查看前 x - 1 个是否已经满足
                // 加入这个数后,前 x - 1 是否是否有数的和为 y - nums[x-1]
                dp[y][x] = dp[y][x-1] || dp[y-nums[x-1]][x-1];
            }
        }
    }
    return dp[target][n];
}

你可能感兴趣的:(leetcode,算法,动态规划)