Claim
- All numbers in a non-empty array are positive integers. Can the elements of this array be divided into two parts so that the numbers in each part are equal
- Up to 200 numbers, each number up to 100
Examples
- [1,5,11,5], return true
- [1,2,3,5], return false
Ideas
- Pick a certain item out of n items and fill the sum / 2 backpack
- Status: F (n, C)
- 转移:F(i,c)=F(i-1,c) || F(i-1,c-w(i))
- Complexity: O (n * sum / 2) = O (n * sum)
achieve
Recursive + memory search
1 class Solution { 2 private : 3 // memo [i] [c] means whether the element with index [0 ... i] can completely fill a backpack with capacity c 4 // -1 means not calculated, 0 means not fillable, 1 means fillable 5 vector <vector < int >> memo; 6 7 // If you use nums [0 ... index], can you completely fill a backpack with sum capacity 8 bool tryPartition ( const vector < int > & nums, int index, int sum) { 9 10 if (sum == 0 ) 11 return true ; 12 13 if( sum < 0 || index < 0 ) 14 return false; 15 16 if( memo[index][sum] != -1 ) 17 return memo[index][sum] == 1; 18 19 memo[index][sum] = ( tryPartition(nums, index-1, sum ) || 20 tryPartition(nums, index-1, sum-nums[index] ) ) ? 1 : 0; 21 return memo[index][sum] == 1; 22 } 23 public: 24 bool canPartition(vector<int>& nums) { 25 int sum = 0 ; 26 for( int i = 0 ; i < nums.size() ; i ++ ){ 27 assert( nums[i] > 0 ); 28 sum += nums[i]; 29 } 30 31 if( sum%2 != 0 ) 32 return false; 33 34 memo = vector<vector<int>>( nums.size(), vector<int>(sum/2+1,-1)); 35 return tryPartition( nums, nums.size()-1, sum/2 ); 36 } 37 };
Dynamic programming
1 class Solution { 2 3 public: 4 bool canPartition(vector<int>& nums) { 5 int sum = 0 ; 6 for( int i = 0 ; i < nums.size() ; i ++ ){ 7 assert( nums[i] > 0 ); 8 sum += nums[i]; 9 } 10 11 if( sum%2 != 0 ) 12 return false; 13 14 int n = nums.size(); 15 int C = sum/2; 16 vector<bool> memo(C+1, false); 17 18 for( int i = 0 ; i <= C ; i ++ ) 19 memo[i] = ( nums[0] == i ); 20 21 for( int i = 1 ; i < n ; i ++ ) 22 for( int j = C ; j >= nums[i] ; j -- ) 23 memo[j] = memo[j] || memo[j-nums[i]]; 24 25 return memo[C]; 26 } 27 };
Related
- 322 Coin Change
- 377 Combination Sum IV
- 474 Ones and Zeros
- 139 Word Break
- 494 Target Sum