leetcode416. 分割等和子集
题目描述:
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200
思路:首先有个剪枝策略,就是数组和一定是偶数才能分。剩下的就是和0-1背包没差别了,背包大小就是数组和除以2。
class Solution {
public:
int dp[20000]={0};
bool canPartition(vector<int>& nums) {
int sum=0;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
}
if(sum%2!=0)return false;
sum/=2;
for(int i=0;i<nums.size();i++)
{
for(int j=sum;j>=nums[i];j--)
{
dp[j]=max(dp[j-nums[i]]+nums[i],dp[j]);
if(dp[j]==sum)return true;
}
}
return false;
}
};