#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
bool is_exist(const vector<size_t>& vec, const size_t num) {
const auto count = vec.size();
vector<vector<bool>> matrix(count + 1, vector<bool>(num + 1, false));
for (size_t i = 0; i <= count; ++i) matrix[i][0] = true;
for (size_t i = 1; i <= count; ++i) {
for (size_t j = 1; j <= num; ++j) {
if (vec[i - 1] <= j) {
matrix[i][j] = matrix[i - 1][j] || matrix[i - 1][j - vec[i - 1]];
} else {
matrix[i][j] = matrix[i - 1][j];
}
}
}
return matrix[count][num];
}
int main() {
size_t n;
cin >> n;
vector<size_t> m(n);
for (auto& i : m) cin >> i;
if (n < 2) puts("NO");
else if (2 == n) puts(m.front() != m.back() ? "NO" : "YES");
else {
auto sum = accumulate(begin(m), end(m), size_t(0));
if (sum & 1) puts("NO");
else {
sum /= 2;
puts(is_exist(m, sum) ? "YES" : "NO");
}
}
}
Первая строка входных данных содержит натуральное число n, не превышающее 100. Далее идет n натуральных чисел mi, не превышающих 100.
Программа должна вывести «yes», если гирьки можно разложить на две кучки равной массы, или «no» в противном случае.
Входные данные
4
4 2 3 1
Результат работы
YES