给定一个只包含正整数的非空数组。 注意: 来源:力扣(LeetCode) 936 ms 16.3 MB 312 ms 8.9 MB 164 ms 8.8 MB
1. 题目
是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
每个数组中的元素不会超过 100
数组的大小不会超过 200示例 1: 输入: [1, 5, 11, 5] 输出: true 解释: 数组可以分割成 [1, 5, 5] 和 [11]. 示例 2: 输入: [1, 2, 3, 5] 输出: false 解释: 数组不能分割成两个元素和相等的子集.
链接:https://leetcode-cn.com/problems/partition-equal-subset-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题
class Solution { public: bool canPartition(vector<int>& nums) { if(nums.size() <= 1) return false; int sum = 0, i, j; for(i = 0 ; i < nums.size(); ++i) sum += nums[i]; if(sum&1) return false;//奇数不可分 //dp求解,每个元素拿或者不拿,求解所有的状态 set<int> state; state.insert(0);//初始化 state.insert(nums[0]); for(i = 1; i < nums.size(); ++i) { for(auto it = state.rbegin(); it != state.rend(); ++it) { //用set,不能用哈希set,且必须逆序遍历,新插入的不会被本次遍历到 state.insert(*it+nums[i]); } if(state.count(sum>>1)) return true; } return false; } };
class Solution { public: bool canPartition(vector<int>& nums) { if(nums.size() <= 1) return false; int sum = 0, i, j; for(i = 0 ; i < nums.size(); ++i) sum += nums[i]; if(sum&1) return false;//奇数不可分 //dp求解,每个元素拿或者不拿,求解所有的状态 vector<bool> state(sum+1, false); state[0] = true;//初始化 state[nums[0]] = true; for(i = 1; i < nums.size(); ++i) { for(j = sum; j >= 0; --j) { if(state[j]) state[j+nums[i]] = true; } if(state[sum>>1]) return true; } return false; } };
class Solution { public: bool canPartition(vector<int>& nums) { if(nums.size() <= 1) return false; int sum = 0, i, j; for(i = 0 ; i < nums.size(); ++i) sum += nums[i]; if(sum&1) return false;//奇数不可分 //dp求解,每个元素拿或者不拿,求解所有的状态 sum >>= 1; vector<bool> state(sum+1, false); state[0] = true;//初始化 state[nums[0]] = true; for(i = 1; i < nums.size(); ++i) { for(j = sum; j >= 0; --j) { if(state[j] && j+nums[i] <= sum) state[j+nums[i]] = true; } if(state[sum]) return true; } return false; } };
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算