Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

ПОМОГИТЕ ПРОШУ ПОЖАЛУЙСТА С++

Лейла Нуриева Ученик (90), открыт 1 неделю назад
Дан набор гирек массой m1, . . . , mn. Можно ли их разложить на две чаши весов таким образом, чтобы они оказались в равновесии?

Первая строка входных данных содержит натуральное число n, не превышающее 100. Далее идет n натуральных чисел mi, не превышающих 100.

Программа должна вывести «yes», если гирьки можно разложить на две кучки равной массы, или «no» в противном случае.

Входные данные

4
4 2 3 1
Результат работы

YES
1 ответ
Николай Веселуха Высший разум (368762) 1 неделю назад
 #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");
}
}
}
Похожие вопросы