|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述:
- 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
- 注意:
- 每个数组中的元素不会超过 100
- 数组的大小不会超过 200
- 示例 1:
- 输入: [1, 5, 11, 5]
- 输出: true
- 解释: 数组可以分割成 [1, 5, 5] 和 [11].
-  
- 示例 2:
- 输入: [1, 2, 3, 5]
- 输出: false
- 解释: 数组不能分割成两个元素和相等的子集.
- 来源:力扣(LeetCode)
- 链接:https://leetcode-cn.com/problems/partition-equal-subset-sum
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码
- class Solution {
- public:
- bool canPartition(vector<int>& nums) {
- //计算累加和
- int len = nums.size();
- vector<int>store(len+1, 0);
- store[0] = 0;
- store[1] = nums[0];
- //预判
- for(int i = 2; i <= len; i++){
- store[i] = store[i-1] + nums[i-1];
- }
- if(store[len] % 2 != 0)return false;
- vector<vector<bool> >dp(len, vector<bool>(store[len] + 1, false));
- //初始化
- for(int i = 0; i < len; i++){
- dp[i][0] = true;
- }
- dp[0][nums[0]] = true;
- //动态规划
- for(int i = 1; i < len; i++){
- for(int j = 0; j <= store[i]; j++){
- if(dp[i-1][j] == true){
- //不加当前
- dp[i][j] = true;
- //加当前
- dp[i][j + nums[i]] = true;
- if(j + nums[i] == store[len] / 2)return true;
- //cout << i << " " << j << "--"<< i << " " << j + nums[i] << "--";
- }
- }
- //cout << endl;
- }
- return false;
- }
- };
复制代码 |
|