Journey of LeetCode|DAY 36
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;
}
};