DP45. 分割等和子集
描述
输入描述
输出描述
如果满足题目条件,输出 true ,否则输出 false示例1
输入:
4 1 5 11 5
输出:
true
示例2
输入:
4 1 2 3 5
输出:
false
C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-05-13
#include <iostream> #include <unordered_map> #include <stdio.h> #include <vector> #include <algorithm> #include<cstdio> #include<cstdlib> #include<climits> using namespace std; int main() { int n,rest=0; cin>>n; vector<int> num(n); for(int i=0;i<n;i++){ cin>>num[i]; rest+=num[i]; } if(rest%2==1) {cout<<"false"; return 0;} unordered_map<int,bool> mp; mp[0]=true; for(int i=0;i<n;i++) { for(auto it=mp.begin();it!=mp.end();it++) { if(it->first+num[i]==rest/2){ cout<<"true"; return 0; } mp[it->first+num[i]]=true; } } cout<<"false"; } /* int main() { int n,rest=0; cin>>n; vector<int> num(n); for(int i=0;i<n;i++){ cin>>num[i]; rest+=num[i]; } vector<vector<bool>> dp(n+1,vector<bool>(rest+1,false)); for(int i=0;i<=n;i++) { for(int j=0;j<=rest;j++) { if(rest-j==j) dp[i][j]=true; if(rest-j>j) dp[i][j]=false; } } for(int i=n-1;i>=0;i--) { for(int j=0;j<=rest;j++) { dp[i][j]=dp[i+1][j]; if(j-num[i]>=0) dp[i][j]=dp[i][j]||dp[i+1][j-num[i]]; } } cout<<(dp[0][rest]?"true":"false"); } */
C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-06-02
#include<bits/stdc++.h> using namespace std; int main(){ int n,msum=0; int nums[502]; cin>>n; for(int i=1;i<=n;i++){ cin>>nums[i]; msum+=nums[i]; } if(msum%2==1){ cout<<"false"; }else{ cout<<"true"; } return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-04-22
#include<iostream> #include<vector> #include<unordered_map> using namespace std; int main(){ int n; cin>>n; vector<int> nums(n); int sum=0; for(int i=0;i<n;i++){ cin>>nums[i]; sum+=nums[i]; } if(sum%2!=0) { cout<<"false"; return 0; } //vector<int> dp(sum+1); unordered_map<int,bool> mp; mp[0]=true; for(int i=0;i<n;i++) for(auto it=mp.begin();it!=mp.end();it++){ if(it->first+nums[i]==sum/2){ cout<<"true"; return 0; } mp[it->first+nums[i]]=true; } cout<<"false"; return 0; }
C++ 解法, 执行用时: 4ms, 内存消耗: 404KB, 提交时间: 2022-05-08
#include<iostream> #include<vector> #include<unordered_map> using namespace std; int main() { int n; cin >> n; vector<int> a(n); int sum = 0; for (int i = 0; i < n; i++) { cin >> a[i]; sum += a[i]; } if (sum % 2 != 0) { cout << "false"; return 0; } unordered_map<int, bool> p; p[0] = true; for (int i = 0; i < n; i++) for (auto it = p.begin(); it != p.end(); it++) { if (it->first + a[i] == sum / 2) { cout << "true"; return 0; } p[it->first + a[i]] = true; } cout << "false"; return 0; }
C++ 解法, 执行用时: 4ms, 内存消耗: 408KB, 提交时间: 2022-06-18
#include<iostream> #include<algorithm> using namespace std; const int N=1009; int dp[N],a[N]; bool cmp(int a,int b) { return a>b; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) { if(dp[i-1]<=0) dp[i]=dp[i-1]+a[i]; else dp[i]=dp[i-1]-a[i]; } if(dp[n]==0) cout<<"true"; else cout<<"false"; return 0; }