Зауважимо, що якщо числа і n - 3 помістити в одну групу, а n - 1 і n - 2 помістити в іншу (сума чисел у кожній групі буде однаковою), то задача зведеться до аналогічної задачі меншої розмірності, а саме до розбиття на групи чисел 1, 2, ..., n - 4.
Для n \le 3 числа розподілимо по групах наступним чином:
Якщо залишаються три числа , то їх можна розділити на дві групи: і .
Якщо залишаються два числа , то розділимо їх на групи: і . Різниця сум чисел у групах становитиме .
Якщо залишається одне число , то його можна помістити в будь-яку групу. Різниця сум чисел у групах становитиме .
Якщо сума всіх чисел від до парна, то їх можна розділити на дві групи з однаковою сумою.
Якщо сума всіх чисел від до непарна, то їх можна розділити на дві групи з різницею сум, що дорівнює 1.
Приклад
Нехай n = 10. Числа в групи розміщуємо наступним чином:
Нехай n = 11. Числа в групи розміщуємо наступним чином:
Реалізація алгоритму
Зчитуємо вхідне значення .
scanf("%d", &n);Встановлюємо початкові суми чисел у групах s_1 і s_2 рівними .
s1 = s2 = 0;Перебираємо числа від до у порядку спадання.
for (i = n; i > 0; i--)Якщо s_1 < s_2, то заносимо число в першу групу. Інакше заносимо число в другу групу.
if (s1 < s2)
{
s1 += i;
a.push_back(i);
}
else
{
s2 += i;
b.push_back(i);
}Виводимо розміри груп.
printf("%d %d\n", a.size(), b.size());Виводимо числа першої групи.
for (i = 0; i < a.size(); i++)
printf("%d ", a[i]);
printf("\n");Виводимо числа другої групи.
for (i = 0; i < b.size(); i++)
printf("%d ", b[i]);
printf("\n");