题目:416. 分割等和子集
思路:动态规划dp,时间复杂度0(n*sum(nums))。
C++版本:
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum=0;
for(auto x:nums){
sum+=x;
}
if(sum%2) return false;
vector<int> f(sum/2+1,0);
f[0]=1;
for(auto x:nums){
for(int i=sum/2;i>=x;i--){
f[i]=f[i]|f[i-x];
}
}
return f[sum/2];
}
};
JAVA版本:
class Solution {
public boolean canPartition(int[] nums) {
int sum=0;
for(int x:nums){
sum+=x;
}
if(sum%2!=0) return false;
boolean[] f=new boolean[sum/2+1];
f[0]=true;
for(int x:nums){
for(int i=sum/2;i>=x;i--){
f[i]=f[i]|f[i-x];
}
}
return f[sum/2];
}
}
Go版本:
func canPartition(nums []int) bool {
sum:=0
for i := range nums {
sum+=nums[i];
}
if sum%2!=0 {
return false;
}
f := make([]bool,sum/2+1)
f[0]=true;
for i := range nums {
for j:=sum/2;j>=nums[i];j-- {
f[j] = f[j]||f[j-nums[i]]
}
}
return f[sum/2];
}