[Leetcode] #416 Partition Equal Subset Sum

来源:互联网 发布:mac迅雷怎么看片 编辑:程序博客网 时间:2024/06/05 07:44

Discription:

Given a non-empty array 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.

Note:

  1. Each of the array element will not exceed 100.
  2. The array size will not exceed 200.

Example 1:

Input: [1, 5, 11, 5]Output: trueExplanation: The array can be partitioned as [1, 5, 5] and [11].

Example 2:

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

Solution:

01背包问题。

bool canPartition(vector<int>& nums) {int sum = 0;int n = nums.size();for (int i = 0; i < nums.size(); i++){sum += nums[i];}if (sum % 2 == 1)return false;sum = sum / 2;vector<vector<int>> dp(n + 1, vector<int>(sum + 1, 0));for (int i = 1; i <= n; i++){for (int j = 1; j <= sum; j++){if (j >= nums[i - 1]){dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i - 1]] + nums[i - 1]);}else{dp[i][j] = dp[i - 1][j];}}}return dp[n][sum] == sum ? true : false;}
bool canPartition(vector<int>& nums) { //利用滚动数组实现int sum = 0;int n = nums.size();for (int i = 0; i < nums.size(); i++){sum += nums[i];}if (sum % 2 == 1)return false;sum = sum / 2;vector<int> dp(sum + 1, 0);for (int i = 1; i <= n; i++){for (int j = sum; j >= nums[i-1]; j--)dp[j] = max(dp[j], dp[j - nums[i - 1]] + nums[i - 1]);}return dp[sum] == sum ? true : false;}

0 0
原创粉丝点击