难以理解平衡分区的逻辑

时间:2016-06-21 02:33:13

标签: c++ arrays algorithm bit-manipulation np-complete

我正在解决this link的平衡分区问题。在这个问题中,我们必须将数组分成相等的部分,使得它们之和之间的差异最小。 因此,我发现的解决方案是考虑所有情况是否一个元素将被包含在一个组中是否意味着我们必须尝试所有2 ^ n个案例。

我想出了一个解决方案,他使用位操作来划分数组,但我没有得到逻辑。 我发布下面的代码。有人请告诉我他是如何划分阵列的?

#include<bits/stdc++.h>
using namespace std;
#define N 11

void solve(int a[N])
{
    long long x,y,v1,v2,res,i,j;
    long long val=1<<N;
    res=INT_MAX;
    for(i=0;i<val;i++)
    {
        x=y=v1=v2=0;
        for(j=0;j<N;j++)
        {
            if(i & (1<<j))
            {
                x++;
                v1+=a[j];
            }
            else
            {
                y++;
                v2+=a[j];
            }
        }
        if(abs(x-y)<=1) res=min(res,abs(v1-v2));
    }
    cout<<res<<endl;
}
int main()
{
    int a[] = {23, 45, -34, 12, 0, 98, -99, 4, 189, -1, 4};
    solve(a);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

要进行优化,您可以尝试对每个cicle子集的第一个和最后一个元素求和,这样可以避免对子集的所有元素数进行cicling,但只会多次cicling等于子集大小的一半。

在您的示例中,外部循环迭代保持不变,而内部循环迭代2:

(for(j=0; j<(N/2); j++)

以及您分组的子集元素的总和:

v(1|2)+=(a[j] + a[N-j]);