划分數組為和相等的兩部分
416. Partition Equal Subset Sum (Medium)
題目描述:
給定一個數組,判斷其是否可以被划分為相等的兩部分。
思路分析:
我們可以換一種思路,判斷其是否可以分為相等的兩部分,其實就是看是否能在數組中挑選出和為數組和一半的序列。那么就可以轉化為背包問題,在N個數中挑選數字使其和為數組和的一半,狀態轉移方程為:
dp[i]=dp[i] || dp[i-num]
代碼:
public boolean canPartition(int []nums){
int sum=0;
for(int num:nums){
sum=sum+num;
}
if(sum%2!=0)
return false;
int target=sum/2;
boolean []dp=new boolean [target+1];
dp[0]=true;
for(int num:nums){ //0-1背包一個物品只能用一次
for(int i=target;i>=num;i--){ //從后向前,先計算dp[i],再計算dp[i-num]
dp[i]=dp[i]||dp[i-num];
}
}
return dp[target];
}