长春电商网站建设公司电话,购买深圳网站定制开发,什么叫页面价格,字体设计作品赏析LCR 101. 分割等和子集
给定一个非空的正整数数组 nums #xff0c;请判断能否将这些数字分成元素和相等的两部分。
示例 1#xff1a; 输入#xff1a;nums [1,5,11,5] 输出#xff1a;true 解释#xff1a;nums 可以分割成 [1, 5, 5] 和 [11] 。
示例 2#xff1a;…LCR 101. 分割等和子集
给定一个非空的正整数数组 nums 请判断能否将这些数字分成元素和相等的两部分。
示例 1 输入nums [1,5,11,5] 输出true 解释nums 可以分割成 [1, 5, 5] 和 [11] 。
示例 2 输入nums [1,2,3,5] 输出false 解释nums 不可以分为和相等的两部分
提示 1 nums.length 200 1 nums[i] 100
动态规划01背包
dp[i][j]表示从前 i 个数字中选出若干个刚好可以使得被选出的数字其和为 j。 本题就是要返回dp[n-1][target]
class Solution {
public:bool dp[205][10005];bool canPartition(vectorint nums){dp[0][0]1;int nnums.size();int sum0;for(int i0;in;i) sumnums[i];if(sum%2!0) return 0;int targetsum/2;for(int i1;itarget;i) dp[0][i]0;for(int i1;in;i){for(int j0;jtarget;j){if(nums[i]j) dp[i][j]dp[i-1][j];else dp[i][j]dp[i-1][j]|dp[i-1][j-nums[i]];}}return dp[n-1][target];}
};优化
class Solution {
public:bool dp[10005];bool canPartition(vectorint nums){dp[0]1;int nnums.size();int sum0;for(int i0;in;i) sumnums[i];if(sum%2!0) return false;int targetsum/2;for(int i1;in;i){for(int jtarget;jnums[i];j--){if(dp[target]) return true;dp[j]dp[j]|dp[j-nums[i]];}}return dp[target];}
};