给一个数组,判断是否存在一个子集的和等于剩下的数组元素之和
思路:就是判断是否存在一个数组子集之和等于所有数组和的一半。
如果数组之和为奇数,则一定不存在。
public class Solution{
public boolean canPartition(int[] nums){
int sum = 0;
for(int i:nums){
sum += i;
}
if((sum & 1) == 1) return false;
sum /=2;
int n = nums.length;
// dp[i][j]表示在前i个数中寻找和为j的情况,true表示存在,false表示不存在
// dp[i][j] = dp[i-1][j] 表示对第i个元素不进行选择,和仍然为j
// dp[i][j] = dp[i-1][j - nums[i-1]];
boolean[][] dp = new boolean[n+1][sum + 1];
dp[0][0] = true;
for(int i=1;i< n+1;i++){
for(int j=0;j<sum +1;j++){
dp[i][j] = dp[i - 1][j];
if(j >= nums[i-1]){
dp[i][j] = dp[i - 1][j] || dp[i-1][j-nums[i-1]];
}
}
}
return dp[n][sum];
}
}