using
System;
using
System.Collections.Generic;
class
GFG
{
public
static
int
MinimumDifference(
int
[] arr)
{
int
n = arr.Length;
int
N = n / 2;
List<
int
>[] left =
new
List<
int
>[N + 1];
List<
int
>[] right =
new
List<
int
>[N + 1];
for
(
int
i = 0; i <= N; i++)
{
left[i] =
new
List<
int
>();
right[i] =
new
List<
int
>();
}
int
totalSum = 0;
foreach
(
int
num
in
arr)
{
totalSum += num;
}
for
(
int
maskItr = 0; maskItr < (1 << N); maskItr++)
{
int
index = 0;
int
leftSum = 0;
int
rightSum = 0;
for
(
int
i = 0; i < N; i++)
{
if
((maskItr & (1 << i)) != 0)
{
index++;
leftSum += arr[i];
rightSum += arr[i + N];
}
}
left[index].Add(leftSum);
right[index].Add(rightSum);
}
for
(
int
index = 0; index <= N; index++)
{
right[index].Sort();
}
int
result = Math.Min(
Math.Abs(totalSum - 2 * left[N][0]),
Math.Abs(totalSum - 2 * right[N][0]));
for
(
int
index = 1; index < N; index++)
{
foreach
(
int
a
in
left[index])
{
int
b = (totalSum - 2 * a) / 2;
int
rightIndex = N - index;
List<
int
> v = right[rightIndex];
int
idx = LowerBound(v, b);
if
(idx != v.Count)
{
result = Math.Min(
result,
Math.Abs(totalSum - 2 * (a + v[idx])));
}
}
}
return
result;
}
private
static
int
LowerBound(List<
int
> arr,
int
target)
{
int
left = 0;
int
right = arr.Count;
while
(left < right)
{
int
mid = left + (right - left) / 2;
if
(arr[mid] < target)
{
left = mid + 1;
}
else
{
right = mid;
}
}
return
left;
}
public
static
void
Main(
string
[] args)
{
int
[] arr = { 3, 8, 6, 3 };
int
ans = MinimumDifference(arr);
Console.WriteLine(
"Minimun Difference: "
+ ans);
}
}