Notiamo che se i numeri e n - 3 vengono inseriti in un gruppo, e n - 1 e n - 2 in un altro (la somma dei numeri in ciascun gruppo sarà uguale), allora il problema si riduce a un problema analogo di dimensione minore, ovvero alla suddivisione in gruppi dei numeri 1, 2, ..., n - 4.
Per n \le 3 distribuiamo i numeri nei gruppi nel seguente modo:
Se restano tre numeri , essi possono essere divisi in due gruppi: e .
Se restano due numeri , li dividiamo nei gruppi: e . La differenza delle somme dei numeri nei gruppi sarà .
Se resta un numero , esso può essere inserito in uno qualsiasi dei gruppi. La differenza delle somme dei numeri nei gruppi sarà .
Se la somma di tutti i numeri da a è pari, allora essi possono essere divisi in due gruppi con somma uguale.
Se la somma di tutti i numeri da a è dispari, allora essi possono essere divisi in due gruppi con una differenza delle somme pari a 1.
Esempio
Sia n = 10. I numeri vengono disposti nei gruppi nel seguente modo:
Sia n = 11. I numeri vengono disposti nei gruppi nel seguente modo:
Implementazione dell'algoritmo
Leggiamo il valore di input .
scanf("%d", &n);Impostiamo le somme iniziali dei numeri nei gruppi s_1 e s_2 uguali a .
s1 = s2 = 0;Scorriamo i numeri da a in ordine decrescente.
for (i = n; i > 0; i--)Se s_1 < s_2, allora inseriamo il numero nel primo gruppo. Altrimenti inseriamo il numero nel secondo gruppo.
if (s1 < s2)
{
s1 += i;
a.push_back(i);
}
else
{
s2 += i;
b.push_back(i);
}Stampiamo le dimensioni dei gruppi.
printf("%d %d\n", a.size(), b.size());Stampiamo i numeri del primo gruppo.
for (i = 0; i < a.size(); i++)
printf("%d ", a[i]);
printf("\n");Stampiamo i numeri del secondo gruppo.
for (i = 0; i < b.size(); i++)
printf("%d ", b[i]);
printf("\n");