题解 | #分割等和子集#
分割等和子集
https://www.nowcoder.com/practice/65ade309fa4d4067a9add749721bfdc0
如果能分成相等的两份的话,那么sum一定是偶数
1.sum是奇数的话 就false
2.如果是偶数 就变成了0-1背包问题 求数组和是否有和为sum / 2的子数组 有就是true
3.没有就false
#include <algorithm> #include <iostream> using namespace std; // 数组元素加和 100 * 500 = 50000 sum / 2是25000 所以要开大于25000 const int N = 25000; int f[N], a[N], sum; int main() { int n; cin >> n; for(int i = 1; i <= n; i ++){ cin >> a[i]; sum += a[i]; } if(sum % 2 != 0) cout << "false" << endl; else{ f[0] = 1; for(int i = 1; i <= n; i ++) for(int j = sum / 2; j >= a[i]; j --){ f[j] = f[j] || f[j - a[i]]; } if(f[sum / 2]) cout << "true" << endl; else cout << "false"<< endl; } }