题目描述:

方法1:把题目修改为0-1背包问题,nums[i] 为物品i的重量与价值,背包容量为nums元素之和的一半,如果装的最大价值为背包容量,则返回true

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for(int i=0;i<nums.size();i++) sum += nums[i];
        if(sum%2 == 1)return false;//元素之和为奇数,肯定撒false

        int n = nums.size();//物品种类
        int m = sum/2;//背包容量
        vector<int>dp(m+1,0);
        for(int i=0;i<n;i++){
            for(int j=m;j>=nums[i];j--) dp[j] = max(dp[j],dp[j-nums[i]] + nums[i]);
        }
        return dp[m]==m?true:false;
    }
};