dp篇
整体思路:
这个问题是判断给定整数数组 nums
是否可以划分为两个子集,使得两个子集的元素和相等。这等价于判断数组的总和是否为偶数(如果总和是奇数,显然无法划分),然后判断是否存在一个子集的和等于总和的一半。这里使用动态规划的方法来解决这个问题。
class Solution {
public boolean canPartition(int[] nums) {
int s=0;
for(int num:nums){
s+=num;
}
if(s%2!=0){
return false;
}
s/=2;
int n=nums.length;
//dp数组
boolean[] f=new boolean[s+1];
f[0]=true;
int s2=0;
for(int i=0;i<n;i++){
int x=nums[i];
s2=Math.min(s2+x,s);
for (int j=s2;j>=x;j--){
f[j]=f[j]||f[j-x];
}
}
return f[s];
}
}