Leetcode 416. Partition Equal Subset Sum

[集合能不能分成2个相等的子集]

https://leetcode-cn.com/problems/partition-equal-subset-sum

Note:
Each of the array element will not exceed 100.
The array size will not exceed 200.
 
Example 1:
Input: [1, 5, 11, 5]
Output: true
Explanation: The array can be partitioned as [1, 5, 5] and [11].

Example 2:
Input: [1, 2, 3, 5]
Output: false
Explanation: The array cannot be partitioned into equal sum subsets.

 

  • 数字是物品重量,和的一半是背包,dp记录true or false

  • 初始化时,dp全为false

  • 同样注意 dp[0]初始化为true,这样才能使 重1的物品面对1体积背包时候,d[1] = d[1](初始化为false) || d[1-1] = true

  • 状态转移为 当前更新dp上面的一个结果和左边一个结果的与操作 dp[v] = dp[v] || dp[v-w[i]]

  • 注意从后面开始遍历,不然下图的1那一行会变成都是True

 

如图,令集合为1 5 11 5 sum一半是1,背包从0到12

从右至左更新

背包 0 1 2 3 4 5 6 7 8 9 10 11 12
初始化 true false false false false false false false false false false false false
1 T T F F F F F F F F F F F
5 T T F F F T T F F F F F F
11 T T F F F T T F F F F T T
5 T T F F F T T F F F F T T

这该死的长度限制 cnblog改一下

cnblogs_post_body th, #cnblogs_post_body td, .cnblogs-post-body th, .cnblogs-post-body td {
   border: 1px solid #c0c0c0;
   border-collapse: collapse;
   padding: 8px 14px;
   /*min-width: 50px;*/
   min-width: inherit;
}

 

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int n = nums.size();
        int sum=0;
        for (int num : nums) sum += num;
        if(sum % 2) return false;
        sum = sum/2;
        vector<bool> dp(sum+1, false);
        dp[0] = true;
        for(int i=0;i<n;i++){
            for(int j=sum;j>=nums[i];j--){
                dp[j] = dp[j] || dp[j-nums[i]];
            }
        }
        return dp[sum];
    }
};
posted @ 2020-03-30 16:34  种树人  阅读(118)  评论(0编辑  收藏  举报