Добавлен: 07.11.2023
Просмотров: 80
Скачиваний: 2
| | Выполнил Студент гр. ПИ-212 Шарф А.А ______________ (подп., дата) Проверил Старший преподаватель каф. ИВТ Карабцов Р.Д. (подп., дата) |
, причем вес задается целым числом между 1 и 450. Число участников пикника не превышает 100.
Между двумя последовательными тестовыми блоками также находится пустая строка.
Выходные данные
Для каждого тестового блока вы должны вывести строку, содержащую два числа: суммарный вес людей в одной команде и суммарный вес людей в другой команде. Если эти числа отличны, выведите сначала меньшее.
Выходные данные для двух последовательных блоков должны быть разделены пустой строкой.
Пример входных данных
1
3
100
90
200
Соответствующие выходные данные
190 200
Код:
#include
#include
#include
#include
#include
using namespace std;
int N;
int W[100 + 5];
long long dp[450 * 100 + 5];
void solve()
{
int sum = accumulate(W + 1, W + N + 1, 0);
memset(dp, 0, sizeof(dp));
dp[0] = 1 << 0;
for (int i = 1; i <= N; ++i)
for (int j = sum; j >= 0; --j)
if (dp[j])
dp[j + W[i]] |= dp[j] << 1;
int minDiff = 450 * 100;
int teamOneWeight = 0, teamTwoWeight = 0;
for (int i = 0; i <= sum; ++i)
if (dp[i] & (1ll << (N / 2)))
{
int diff = abs(i - (sum - i));
if (diff < minDiff)
{
minDiff = diff;
teamOneWeight = min(i, sum - i);
teamTwoWeight = max(i, sum - i);
}
}
cout << teamOneWeight << " " << teamTwoWeight << endl;
}
int main()
{
int T, Case = 0;
cin >> T;
while (T--)
{
cin >> N;
for (int i = 1; i <= N; ++i)
cin >> W[i];
if (++Case > 1)
cout << endl;
solve();
}
}
Результат: