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].
思路
要实现分割等和子集,只要找出子集,相加之和等于nums总和的一半。
所以问题可以抽象为01背包问题,背包容量为target,nums为物品,每个nums[i]的体积是nums[i],价值也为nums[i]。
dp[j]表示当背包容量为j的时候,nums[0]~nums[j]所能放的最多的物品重量。
对于每个物品nums[i],有放和不放两种状态,所以dp[i]=max(dp[i] , dp[i-weight[i]] + vallue[i]),即dp[i]=max(dp[i] , dp[i-nums[i]] + nunms[i])
当target==dp[target]时,表明背包装满了
AC代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum=0;
for(auto num:nums)
sum+=num;
if(sum%2==1)return false;
int target=sum/2;
vector<int> dp(10001,0);
for(int i=0;i<nums.size();i++)
for(int j=target;j>=nums[i];j--)
dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
if(dp[target]==target)return true;
return false;
}
};