国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

416. Partition Equal Subset Sum

2019-11-06 07:18:09
字體:
來源:轉載
供稿:網友

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

Note: Each of the array element will not exceed 100. The array size will not exceed 200. Example 1:

Input: [1, 5, 11, 5]Output: trueExplanation: The array can be partitioned as [1, 5, 5] and [11].

Example 2:

Input: [1, 2, 3, 5]Output: falseExplanation: The array cannot be partitioned into equal sum subsets.

http://www.cnblogs.com/grandyang/p/5951422.html 這道題給了我們一個數組,問我們這個數組能不能分成兩個非空子集合,使得兩個子集合的元素之和相同。那么我們想,原數組所有數字和一定是偶數,不然根本無法拆成兩個和相同的子集合,那么我們只需要算出原數組的數字之和,然后除以2,就是我們的target,那么問題就轉換為能不能找到一個非空子集合,使得其數字之和為target。開始我想的是遍歷所有子集合,算和,但是這種方法無法通過OJ的大數據集合。于是乎,動態規劃DP就是我們的不二之選。我們定義一個一維的dp數組,其中dp[i]表示數字i是否是原數組的任意個子集合之和,那么我們我們最后只需要返回dp[target]就行了。我們初始化dp[0]為true,由于題目中限制了所有數字為正數,那么我們就不用擔心會出現和為0或者負數的情況。那么關鍵問題就是要找出遞歸公式了,我們需要遍歷原數組中的數字,對于遍歷到的每個數字nums[i],我們需要更新我們的dp數組,要更新[nums[i], target]之間的值,那么對于這個區間中的任意一個數字j,如果dp[j - nums[j]]為true的話,那么dp[j]就一定為true,于是地推公式如下:

dp[j] = dp[j] || dp[j - nums[i]] (nums[i] <= j <= target)

有了遞推公式,那么我們就可以寫出代碼如下:

class Solution {public: bool canPartition(vector<int>& nums) { int sum = accumulate(nums.begin(), nums.end(), 0); if (sum % 2 == 1) return false; int target = sum / 2; vector<bool> dp(target + 1, false); dp[0] = true; for (int i = 0; i < nums.size(); ++i) { for (int j = target; j >= nums[i]; --j) { dp[j] = dp[j] || dp[j - nums[i]]; } } return dp.back(); }};

這道題還可以用bitset來做,感覺也十分的巧妙,bisets的大小設為5001,為啥呢,因為題目中說了數組的長度和每個數字的大小都不會超過100,那么最大的和為10000,那么一半就是5000,前面再加上個0,就是5001了。我們初始化把最低位賦值為1,然后我們算出數組之和,然后我們遍歷數字,對于遍歷到的數字num,我們把bits向左平移num位,然后再或上原來的bits,這樣所有的可能出現的和位置上都為1。舉個例子來說吧,比如對于數組[2,3]來說,初始化bits為1,然后對于數字2,bits變為101,我們可以看出來bits[2]標記為了1,然后遍歷到3,bits變為了101101,我們看到bits[5],bits[3],bits[2]都分別為1了,正好代表了可能的和2,3,5,這樣我們遍歷玩整個數組后,去看bits[sum >> 1]是否為1即可,參見代碼如下:

解法二:

class Solution {public: bool canPartition(vector<int>& nums) { bitset<5001> bits(1); int sum = accumulate(nums.begin(), nums.end(), 0); for (int num : nums) bits |= bits << num; return (sum % 2 == 0) && bits[sum >> 1]; }};
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福泉市| 广汉市| 望城县| 金沙县| 成都市| 怀仁县| 馆陶县| 佳木斯市| 柏乡县| 滁州市| 长白| 静安区| 镇雄县| 湖口县| 大宁县| 喀喇| 论坛| 辉县市| 涞水县| 上犹县| 买车| 许昌市| 安西县| 和林格尔县| 收藏| 社会| 太康县| 义马市| 保靖县| 景泰县| 通辽市| 汨罗市| 昌图县| 当阳市| 囊谦县| 宝山区| 治县。| 株洲市| 衡阳县| 宜州市| 伊金霍洛旗|