题目描述
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100
1、0-1背包问题
只不过dp[i][j]不再表示不超过容量j,而是表示能否达到容量j
2、如果总和是奇数的话,是永远不可能划分为两等份的
class Solution {
public boolean canPartition(int[] nums) {
if(nums==null||nums.length==0)
return true;
int sum=0;
for(int num:nums)
sum+=num;
if(sum%2==1)
return false;
int target=sum/2;
boolean[][] dp=new boolean[nums.length][target+1];
for(int i=0;i<=target;i++)
{
if(nums[0]!=i)
dp[0][i]=false;
else
dp[0][i]=true;
}
for(int i=1;i<nums.length;i++)
{
for(int j=0;j<=target;j++)
{
if(nums[i]<=j)
dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]];
else
dp[i][j]=dp[i-1][j];
}
}
return dp[nums.length-1][target];
}
}