在从数组中删除任何一个元素之后,将奇数大小的数组划分为两个相同大小和相同和的相等组

时间:2017-07-16 04:57:36

标签: algorithm dynamic-programming

给出一个奇数大小的数组。您必须从数组中删除任何一个元素,然后查找是否可以将剩余的偶数大小数组划分为两组相同大小且具有相同元素总和的数组。必须从数组中删除任何一个元素。

1 个答案:

答案 0 :(得分:0)

所以我假设有必要从数组中删除1个元素。

请查看下面的代码段。

int solve(int idx, int s, int cntr, int val) {
 if(idx == n)
    if(cntr != 1)
        return INT_MAX;
    else 
        return abs((sum-val)-2*s);

 int ans = INT_MAX;
 if(cntr == 0)
    ans = min(ans, solve(idx+1, s, cntr+1, arr[idx]));
 else 
    ans = min(ans, min(solve(idx+1,s+arr[idx], cntr, val),   solve(idx+1, s, cntr, val)));
 return ans;  
}

这里sum是原始数组的总和, val是 您要删除的任何位置的元素值,cntr以跟踪是否从数组中删除任何值。

所以这个算法是这样的。

忘记你需要删除任何值,然后问题就变成是否可以将数组分成2个等分和。现在我们可以想到这个问题,例如将数组分成两部分,使abs(sum-2*sum_of_any_half_part)最小化。所以有了这个想法让我们说我最初有一个桶s,它可以是我们关注的数组的一部分。因此,在每个步骤中,我们可以将任何元素放入此部分或将其留给另一部分。

现在,如果我们将删除部分引入此问题,那么只需要进行一次小的更改。现在每步而不是2步,你有3个选择。

  1. 删除此特定元素,然后将cntr增加到1,将val增加到数组中该索引处元素的值。
  2. 不要对这个元素做任何事情。这等于将此元素放入其他桶/半
  3. 将此元素放入存储桶s,即通过arr[idx]增加s的值;
  4. 现在递归检查哪个会给出最好的结果。

    P.S。查看代码段中的基本案例以获得更好的想法。

    最后,如果上面的solve函数给出ans = 0,那么这意味着我们可以在删除任何元素后将数组划分为2个等值部分。

    希望这会有所帮助。