LeetCode DAY36(416. Partition Equal Subset Sum)

Preface

This is a new day to continue my Dynamic programming journey.
Learn something new and keep reviewing what I learnt before.

1. Partition Equal Subset Sum

LeetCode Link: 416. Partition Equal Subset Sum
Given an integer array nums, return true if you can partition the array into two subsets such that the sum of the elements in both subsets is equal or false otherwise.

Example 1:

Input: nums = [1,5,11,5]
Output: true
Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:

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

Constraints:

1 <= nums.length <= 200
1 <= nums[i] <= 100

Analysis and Solution

Dynamic programming

LeetCode C++ as followings 01 BackPack

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;

        // The i in dp[i] represents the sum in the backpack
        // The title says: Each array will not have more than 100 elements, and the size of the array will not exceed 200
        //The sum will not be greater than 20,000, and the backpack only needs half of it at most, so the size of 10,001 is fine
        vector<int> dp(10001, 0);//initialize to 0
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];//get the sum
        }
        // You can also use library functions to sum in one step
        // int sum = accumulate(nums.begin(), nums.end(), 0);
        if (sum % 2 == 1) return false;
        int target = sum / 2;

        // Start 01 Backpack
        for(int i = 0; i < nums.size(); i++) {
            for(int j = target; j >= nums[i]; j--) { // Each element must be non-repeatable, so iterate from largest to smallest
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);//Recursive formula
            }
        }
        // The elements in the set can be summed up exactly as target
        if (dp[target] == target) return true;
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值