lintcode588. 劃分和相等的子集

給一 只含有正整數 的 非空 數組, 找到這個數組是否可以劃分爲 兩個 元素和相等的子集。

樣例
例1:

輸入: nums = [1, 5, 11, 5], 
輸出: true
解釋:
two subsets: [1, 5, 5], [11]2:

輸入: nums = [1, 2, 3, 9], 
輸出: false
注意事項
所有數組元素不超過100.
數組大小不超過200.

思路:先求出數組的總和,如果和是奇數的話,則不可能劃分爲相等的子集。
如果和是偶數的話,則取其一半,進行01揹包,看看和的一半能不能查找到即可

class Solution {
public:
    /**
     * @param nums: a non-empty array only positive integers
     * @return: true if can partition or false
     */
    bool canPartition(vector<int> &nums) {
        // write your code here
        int sum=0;
        for (int i = 0; i < nums.size(); i++) {
            sum+=nums[i];
        }
        if(sum%2) return false;
        int half=sum/2;
        vector<bool> dp(half+1,false);
        dp[0]=true;
        for (int i = 0; i < nums.size(); i++) {
            for(int j = half;j>=nums[i];j--)
            {
                if(dp[j-nums[i]]) dp[j]=true;
            }
        }
        return dp[half];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章