Loading

Leetcode-416-分割等和子集(01背包)

题目链接


题目描述

一个 只包含正整数 的 非空 数组 nums 。
判断是否可以将这个数组分割成两个子集
使得两个子集的元素和相等

思路

01背包问题

  1. 若能分成两个和相等的子集,则总和一定是偶数
  2. 总和的一半看作背包的总体积
  3. 每个元素值,既是价值,又是该元素的体积
  4. 若最后,背包最多能装下的体积刚好是总和的一半,则返回true
  5. 否则返回false

C++代码

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int n = nums.size(), V = 0;
        for (int i = 0; i < n; i++)
            V += nums[i];
        if (V&1) return false;

        V >>= 1;
        vector<int> ans(V+1);

        for (int i = 0; i < n; i++)
            for (int j = V; j>=1; j--)
                if (j >= nums[i])
                    ans[j] = max(ans[j-nums[i]]+nums[i], ans[j]);
        if (ans[V] == V)
            return true;
        return false;
    }
};
posted @ 2022-01-20 18:13  ARUI丶  阅读(21)  评论(0编辑  收藏  举报