416. 分割等和子集

416. 分割等和子集

給定一個只包含正整數非空數組。是否能夠將這個數組分割成兩個子集,使得兩個子集的元素和相等。css

注意:數組

  1. 每一個數組中的元素不會超過 100
  2. 數組的大小不會超過 200

示例 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

相關文章
相關標籤/搜索