Algorithm
Problem Name: 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
Code Examples
#1 Code Example with C Programming
Code -
C Programming
bool canPartition(int* nums, int numsSize) {
int t, s, i, k;
bool *dp, ans;
t = 0;
for (i = 0; i < numsSize; i ++) {
t += nums[i];
}
if (t & 1) return false;
t >>= 1;
dp = calloc(t + 1, sizeof(bool));
//assert(dp);
dp[0] = true;
for (i = 0; !dp[t] && i < numsSize; i ++) {
k = nums[i];
for (s = t; s >= k; s --) {
dp[s] = dp[s - k];
}
}
ans = dp[t];
free(dp);
return ans;
}
Copy The Code &
Try With Live Editor
Input
Output
#2 Code Example with C++ Programming
Code -
C++ Programming
class Solution {
public:
bool canPartition(vector<int>& nums) {
// dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]]
int sum = 0;
for(auto x: nums) sum += x;
if(sum % 2) return false;
vector<vector < bool>>dp(nums.size(>, vector < bool>(sum / 2 + 1, false));
dp[0][0] = true;
for(int i = 1; i < nums.size(); i++)
for(int j = 0; j < sum / 2 + 1; j++)
dp[i][j] = dp[i - 1][j] || ((j >= nums[i]) ? dp[i - 1][j - nums[i]] : 0);
return dp[nums.size() - 1][sum / 2];
}
};
Copy The Code &
Try With Live Editor
Input
Output
#3 Code Example with Java Programming
Code -
Java Programming
class Solution {
public boolean canPartition(int[] nums) {
int sum = 0;
for (int num : nums) {
sum += num;
}
if (sum % 2 == 1) {
return false;
}
sum /= 2;
int n = nums.length;
boolean[] dp = new boolean[sum + 1];
dp[0] = true;
for (int num : nums) {
for (int i = sum; i > 0; i--) {
if (i >= num) {
dp[i] = dp[i] || dp[i - num];
}
}
}
return dp[sum];
}
}
Copy The Code &
Try With Live Editor
Input
Output
#4 Code Example with Javascript Programming
Code -
Javascript Programming
const canPartition = function(nums) {
let sum = 0
for(let num of nums) {
sum += num
}
if(sum & 1 === 1) {
return false
}
sum /= 2
let n = nums.length
const dp = Array.from(new Array(n+1), () => [])
for(let i = 0; i < dp.length; i++) {
dp[i] = new Array(sum+1).fill(false)
}
dp[0][0] = true
for(let i = 1; i < n + 1; i++) {
dp[i][0] = true
}
for(let j = 1; j < sum + 1; j++) {
dp[0][j] = false
}
for(let i = 1; i < n + 1; i++) {
for(let j = 1; j < sum + 1; j++> {
if(j >= nums[i - 1]) {
dp[i][j] = (dp[i -1][j] || dp[i - 1][j - nums[i - 1]])
}
}
}
return dp[n][sum]
};
Copy The Code &
Try With Live Editor
Input
Output
#5 Code Example with Python Programming
Code -
Python Programming
class Solution:
def canPartition(self, nums):
sm, n = sum(nums), len(nums)
if sm % 2:
return False
sm //= 2
dp = [False] * (sm + 1)
dp[0] = True
for num in nums:
for j in range(num, sm + 1)[::-1]:
dp[j] = dp[j] or dp[j - num]
return dp[-1]
Copy The Code &
Try With Live Editor
Input
Output
#6 Code Example with C# Programming
Code -
C# Programming
using System;
namespace LeetCode
{
public class _0416_PartitionEqualSubsetSum
{
public bool CanPartition(int[] nums)
{
int sum = 0, max = int.MinValue;
foreach (var num in nums)
{
sum += num;
max = Math.Max(num, max);
}
if (sum % 2 != 0 || max > sum / 2) return false;
return CanPartition(nums, 2, new bool[nums.Length], sum / 2, 0, 0);
}
private bool CanPartition(int[] nums, int k, bool[] visited, int target, int current, int index)
{
if (k == 1) return true;
if (target == current)
return CanPartition(nums, k - 1, visited, target, 0, 0);
for (int i = index; i < nums.Length; i++)
{
if (visited[i]) continue;
if (current + nums[i] > target) continue;
visited[i] = true;
if (CanPartition(nums, k, visited, target, current + nums[i], i)) return true;
visited[i] = false;
while (i + 1 < nums.Length && nums[i] == nums[i + 1])
i++;
}
return false;
}
}
}
Copy The Code &
Try With Live Editor
Input
Output