給定一個只包含正整數的非空數組。是否能夠將這個數組分割成兩個子集,使得兩個子集的元素和相等。css
注意:數組
示例 1:測試
輸入: [1, 5, 11, 5] 輸出: true 解釋: 數組能夠分割成 [1, 5, 5] 和 [11].
示例 2:spa
輸入: [1, 2, 3, 5] 輸出: false 解釋: 數組不能分割成兩個元素和相等的子集.
方法一:回溯+剪枝code
bool ArraySum(vector<int>& nums, int idx, int recive, int pass ){ if(recive==0 || pass==0 )return true; if(recive<0 || pass<0 )return false; return ArraySum(nums , idx-1 , recive-nums[idx],pass)||ArraySum(nums, idx-1, recive , pass-nums[idx]); } bool canPartition(vector<int>& nums) { int sum=0; for(int i=0;i<nums.size();i++) sum+=nums[i]; if(sum%2==1)return false; else sum/=2; sort(nums.begin(),nums.end()); return ArraySum(nums,nums.size()-1,sum,sum); }
方法二:動態規劃blog
bool canPartition(vector<int>& nums) { int sum=0; for(int k : nums) sum+=k; if(sum & 1)return false; else sum>>=1; vector<bool> dp(sum+1,false); for(int i=0;i<nums.size();i++) for(int j=sum;j>=1;j--){ if(nums[i]==j)dp[j]=1; else if(j>nums[i]) dp[j]=dp[j]||dp[j-nums[i]]; } return dp[sum]; }
不知道是否是測試用例的關係,方法一的耗時是真的香,僅4ms,而方法二500msci