题目描述
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。
分析
01背包问题,每个数字只有取和不取的两种可能。可以理解为容量为sum/2的背包。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| # include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; vector<int> nums(n,0); for(int i=0;i<n;i++) { cin>>nums[i]; } int sum=0; for(int i=0;i<n;i++) { sum+=nums[i]; } if(sum%2==0) { int bag=sum/2; vector<int> dp(bag+1,0); for(int i=0;i<n;i++) { for(int j=bag;j>=nums[i];j--) { dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]); } } if(dp[bag]==bag) cout<<"true"<<endl; else cout<<"false"<<endl; } else cout<<"false"<<endl; }
|