将一堆正整数分为2组,要求2组的和相差最小。
例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int input[101];
int fun(int N, int sum)
{
bool dp1[sum+1];
memset(dp1, false, sizeof(dp1));
bool dp2[sum+1];
memset(dp2, false, sizeof(dp2));
int flag = 0;
int maxVal = 0;
dp1[input[0]] = true;
flag = 1;
for (int i = 1; i < N; i++)
{
if (flag == 0)
{
memset(dp1, false, sizeof(dp1));
for (int j = 0; j <= sum; j++)
{
if (dp2[j])
{
dp1[abs(input[i] - j)] = true;
if (input[i]+j <= sum)
{
dp1[input[i]+j] = true;
}
}
}
flag = 1;
}
else
{
memset(dp2, false, sizeof(dp2));
for (int j = 0; j <= sum; j++)
{
if (dp1[j])
{
dp2[abs(input[i] - j)] = true;
if (input[i]+j <= sum)
{
dp2[input[i]+j] = true;
}
}
}
flag = 0;
}
}
int result = sum;
if (flag == 1)
{
for (int i = 0; i <= sum; i++)
{
if (dp1[i])
{
result = i;
break;
}
}
}
else
{
for (int i = 0; i <= sum; i++)
{
if (dp2[i])
{
result = i;
break;
}
}
}
return result;
}
int main()
{
int N;
cin >> N;
int a;
int sum = 0;
for (int i = 0; i < N; i++)
{
cin >> a;
sum += a;
input[i] = a;
}
cout << fun(N, sum) << endl;
return 0;
}