using
System;
using
System.Collections;
class
GFG{
static
bool
[,,] dp;
static
ArrayList res =
new
ArrayList();
static
int
[] original;
static
int
total_size;
static
bool
possible(
int
index,
int
curr_sum,
int
curr_size)
{
if
(curr_size == 0)
return
(curr_sum == 0);
if
(index >= total_size)
return
false
;
if
(dp[index, curr_sum, curr_size] ==
false
)
return
false
;
if
(curr_sum >= original[index])
{
res.Add(original[index]);
if
(possible(index + 1, curr_sum -
original[index], curr_size - 1))
return
true
;
res.Remove(res[res.Count - 1]);
}
if
(possible(index + 1, curr_sum, curr_size))
return
true
;
dp[index, curr_sum, curr_size] =
false
;
return
dp[index, curr_sum, curr_size];
}
static
ArrayList partition(
int
[] Vec)
{
Array.Sort(Vec);
original = Vec;
res.Clear();
int
total_sum = 0;
total_size = Vec.Length;
for
(
int
i = 0; i < total_size; ++i)
total_sum += Vec[i];
dp =
new
bool
[original.Length,
total_sum + 1,
total_size];
for
(
int
i = 0; i < original.Length; i++)
for
(
int
j = 0; j < total_sum + 1; j++)
for
(
int
k = 0; k < total_size; k++)
dp[i, j, k] =
true
;
for
(
int
i = 1; i < total_size; i++)
{
if
((total_sum * i) % total_size != 0)
continue
;
int
Sum_of_Set1 = (total_sum * i) / total_size;
if
(possible(0, Sum_of_Set1, i))
{
int
ptr1 = 0, ptr2 = 0;
ArrayList res1 =
new
ArrayList(res);
ArrayList res2 =
new
ArrayList();
while
(ptr1 < Vec.Length || ptr2 < res.Count)
{
if
(ptr2 < res.Count &&
(
int
)res[ptr2] == Vec[ptr1])
{
ptr1++;
ptr2++;
continue
;
}
res2.Add(Vec[ptr1]);
ptr1++;
}
ArrayList ans =
new
ArrayList();
ans.Add(res1);
ans.Add(res2);
return
ans;
}
}
ArrayList ans2 =
new
ArrayList();
return
ans2;
}
static
void
Print_Partition(ArrayList sol)
{
for
(
int
i = 0; i < sol.Count; i++)
{
Console.Write(
"["
);
for
(
int
j = 0; j < ((ArrayList)sol[i]).Count; j++)
{
Console.Write((
int
)((ArrayList)sol[i])[j]);
if
(j != ((ArrayList)sol[i]).Count - 1)
Console.Write(
" "
);
}
Console.Write(
"] "
);
}
}
public
static
void
Main(
string
[] args)
{
int
[] Vec = { 1, 7, 15, 29, 11, 9 };
ArrayList sol = partition(Vec);
if
(sol.Count > 0)
Print_Partition(sol);
else
Console.Write(
"-1"
);
}
}