Algobase
  • Introduction
  • Leetcode
    • 226. Invert Binary Tree
    • 136. Single Number
    • 104. Maximum Depth of Binary Tree
    • 344. Reverse String
    • 461. Hamming Distance
    • 617. Merge Two Binary Trees
    • 237. Delete Node in a Linked List
    • 412. Fizz Buzz
    • 206. Reverse Linked List
    • 169. Majority Element
    • 108. Convert Sorted Array to Binary Search Tree
    • 283. Move Zeroes
    • 122. Best Time to Buy and Sell Stock II
    • 242. Valid Anagram
    • 171. Excel Sheet Column Number
    • 217. Contains Duplicate
    • 448. Find All Numbers Disappeared in an Array
    • 13. Roman to Integer
    • 21. Merge Two Sorted Lists
    • 100. Same Tree
    • 121. Best Time to Buy and Sell Stock
    • 350. Intersection of Two Arrays II
    • 268. Missing Number
    • 118. Pascal's Triangle
    • 387. First Unique Character in a String
    • 38. Count and Say
    • 26. Remove Duplicates from Sorted Array
    • 1. Two Sum
    • 53. Maximum Subarray
    • 101. Symmetric Tree
    • 70. Climbing Stairs
    • 543. Diameter of Binary Tree
    • 9. Palindrome Number
    • 191. Number of 1 Bits
    • 202. Happy Number
    • 326. Power of Three
    • 198. House Robber
    • 66. Plus One
    • 724. Find Pivot Index
    • 155. Min Stack
    • 14. Longest Common Prefix
    • 278. First Bad Version
    • 125. Valid Palindrome
    • 172. Factorial Trailing Zeros
    • 20. Valid Parentheses
    • 234. Palindrome Linked List
    • 88. Merge Sorted Array
    • 190. Reverse Bits
    • 160. Intersection of Two Linked Lists
    • 141. Linked List Cycle
    • 189. Rotate Array
    • 28. Implement strStr()
    • 69. Sqrt(x)
    • 204. Count Primes
    • 581. Shortest Unsorted Continuous Subarray
    • 7. Reverse Integer
    • 763. Partition Labels
    • 338. Counting Bits
    • 406. Queue Reconstruction by Height
    • 46. Permutations
    • 94. Binary Tree Inorder Traversal
    • 739. Daily Temperature
    • 22. Generate Parentheses
    • 78. Subsets
    • 347. Top K Frequent Elements
    • 647. Palindromic Substrings
    • 230. Kth Smallest Element in a BST
    • 238. Product of Array Except Self
    • 1143. Longest Common Subsequence
    • 48. Rotate Image
    • 49. Group Anagrams
    • 39. Combination Sum
    • 454. 4Sum II
    • 62. Unique Paths
    • 378. Kth Smallest Element in a Sorted Matrix
    • 64. Minimum Path Sum
    • 102. Binary Tree Level Order Traversal
    • 289. Game of Life
    • 145. Binary Tree Postorder Traversal
    • 287. Find the Duplicate Number
    • 215. Kth Largest Element in an Array
    • 328. Odd Even Linked List
    • 875. Koko Eating Bananas
    • 384. Shuffle an Array
    • 341. Flatten Nested List Iterator
    • 96. Unique Binary Search Trees
    • 11. Container With Most Water
    • 337. House Robber III
    • 394. Decode String
    • 371. Sum of Two Integers
    • 621. Task Scheduler
    • 208. Implement Trie (Prefix Tree)
    • 114. Flatten Binary Tree to Linked List
    • 105. Construct Binary Tree from Preorder and Inorder Traversal
    • 75. Sort Colors
    • 131. Palindrome Partitioning
    • 103. Binary Tree Zigzag Level Order Traversal
    • 36. Valid Sudoku
    • 17. Letter Combinations of a Phone Number
    • 309. Best Time to Buy and Sell Stock with Cooldown
    • 279. Perfect Squares
    • 380. Insert Delete GetRandom O(1)
    • 116. Populating Next Right Pointers in Each Node
    • 236. Lowest Common Ancestor of a Binary Tree
    • 200. Number of Islands
    • 437. Path Sum III
    • 416. Partition Equal Subset Sum
    • 1049. Last Stone Weight II
    • 494. Target Sum
    • 16. 3Sum Closest
    • 148. Sort List
    • 207. Course Schedule
    • 560. Subarray Sum Equals K
    • 438. Find All Anagrams in a String
    • 300. Longest Increasing Subsequence
    • 240. Search a 2D Matrix II
    • 162. Find Peak Element
    • 73. Set Matrix Zeroes
    • 134. Gas Station
    • 139. Word Break
    • 210. Course Schedule II
    • 395. Longest Substring with At Least K Repeating Characters
    • 787. Cheapest Flights Within K Stops
    • 56. Merge Intervals
    • 334. Increasing Triplet Subsequence
    • 713. Subarray Product Less Than K
    • 142. Linked List Cycle II
    • 221. Maximal Square
    • 138. Copy List with Random Pointer
    • 227. Basic Calculator II
    • 6. ZigZag Conversion
    • 150. Evaluate Reverse Polish Notation
    • 34. Find First and Last Position of Element in Sorted Array
    • 322. Coin Change
    • 79. Word Search
    • 19.Remove Nth Node From End of List
    • 33. Search in Rotated Sorted Array
    • 63. Unique Paths II
    • 146. LRU Cache
    • 2. Add Two Numbers
    • 54. Spiral Matrix
    • 55. Jump Game
    • 50. Pow(x, n)
    • 3. Longest Substring Without Repeating Characters
    • 152. Maximum Product Subarray
    • 5. Longest Palindromic Substring
    • 179. Largest Number
    • 324. Wiggle Sort II
    • 127. Word Ladder
    • 91. Decode Ways
    • 15. 3Sum
    • 98. Validate Binary Search Tree
    • 130. Surrounded Regions
    • 8. String to Integer (atoi)
    • 29. Divide Two Integers
    • 166. Fraction to Recurring Decimal
    • 72. Edit Distance
    • 295. Find Median from Data Stream
    • 123. Best Time to Buy and Sell Stock III
    • 829. Consecutive Numbers Sum
    • 31. Next Permutation
    • 173. Binary Search Tree Iterator
    • 92. Reverse Linked List II
    • 95. Unique Binary Search Trees II
    • 24. Swap Nodes in Pairs
    • 209. Minimum Size Subarray Sum
    • 199. Binary Tree Right Side View
    • 120. Triangle
    • 188. Best Time to Buy and Sell Stock IV
    • 442. Find All Duplicates in an Array
    • 222. Count Complete Tree Nodes
    • 47. Permutations II
    • 109. Convert Sorted List to Binary Search Tree
    • 18. 4Sum
    • 153. Find Minimum in Rotated Sorted Array
    • 654. Maximum Binary Tree
    • 695. Max Area of Island
    • 547. Friend Circles
    • 43. Multiply Strings
    • 310. Minimum Height Trees
    • 516. Longest Palindromic Subsequence
    • 241. Different Ways to Add Parentheses
    • 863. All Nodes Distance K in Binary Tree
    • 143. Reorder List
    • 402. Remove K Digits
    • 450. Delete Node in a BST
  • Algorithms & Data Structure
    • Sorting
  • Leetcode SQL
Powered by GitBook
On this page
  • Problem
  • Solution
  • 1. Knapsack
  • 2. DP
  • 3. Optimized DP

Was this helpful?

  1. Leetcode

416. Partition Equal Subset Sum

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

Problem

Given a non-empty array nums containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

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

Solution

1. Knapsack

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for (const auto n: nums) sum += n;
        if (sum % 2 != 0) return false;
        const int size = nums.size() + 1, W = sum / 2 + 1;
        int knapsack[size][W];
        for (int w = 0; w < W; ++w) knapsack[0][w] = 0;
        for (int i = 0; i < size; ++i) knapsack[i][0] = 0;
        for (int i = 1; i < size; ++i) {
            for (int w = 1; w < W; ++w) {
                if (nums[i - 1] <= w) {
                    knapsack[i][w] = max(knapsack[i - 1][w], nums[i - 1] + knapsack[i - 1][w - nums[i - 1]]);
                } else {
                    knapsack[i][w] = knapsack[i - 1][w];
                }
            }
        }
        return knapsack[size - 1][W - 1] == W - 1;
    }
};

2. DP

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for (const auto n: nums) sum += n;
        if (sum % 2 != 0) return false;
        const int size = nums.size() + 1, S = sum / 2 + 1;
        bool dp[size][S];
        for (int s = 0; s < S; ++s) dp[0][s] = false;
        for (int i = 0; i < size; ++i) dp[i][0] = true;
        for (int i = 1; i < size; ++i) {
            for (int s = 1; s < S; ++s) {
                if (nums[i - 1] > s) {
                    dp[i][s] = false;
                } else {
                    dp[i][s] = dp[i - 1][s] || dp[i - 1][s - nums[i - 1]];
                }
            }
        }
        return dp[size - 1][S - 1];
    }
};

3. Optimized DP

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for (const auto n: nums) sum += n;
        if (sum % 2 != 0) return false;
        const int size = nums.size() + 1, S = sum / 2 + 1;
        bool dp[S];
        memset(dp, 0, S);
        dp[0] = true;
        for (int i = 0; i < nums.size(); ++i) {
            for (int s = S - 1; s >= nums[i]; --s) {
                dp[s] = dp[s] || dp[s - nums[i]];
            }
        }
        return dp[S - 1];
    }
};
  • #dp

  • #knapsack

  • #math

Previous437. Path Sum IIINext1049. Last Stone Weight II

Last updated 4 years ago

Was this helpful?