分割等和子集

题目链接:https://leetcode-cn.com/problems/partition-equal-subset-sum/submissions/
题目描述:

题解:
解题参考链接:
动态规划:关于01背包问题,你该了解这些!
动态规划:关于01背包问题,你该了解这些!(滚动数组)
动态规划:分割等和子集可以用01背包!
该题可以转换为0-1背包问题。
1.nums的元素-》物品重量
2.nums总和的一半-》背包重量限额
3.nums的元素-》物品价值
dp[j]:容量为j的背包,所背物品的最大价值为dp[j]。背包正好装满意味着找到了总和为 sum / 2 的子集。

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for(int &item : nums)
        {
             sum += item;
        }
        if(sum % 2 != 0)
            return false;
        int target = sum / 2;
        //dp[j]:容量为j的背包,所背物品的最大价值为dp[j]
        vector<int> dp(10001, 0);  //nums最大总和不超过20000
        for(int i = 1; i < nums.size(); i++)
        {
            for(int j = target; j >= nums[i]; j--)
            {
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
            }
        }
        if(dp[target] == target)
            return true;
        else
            return false;
        
    }
};

posted @ 2021-08-02 11:07  张宵  阅读(46)  评论(0编辑  收藏  举报