Algorithm 不同组合算法(糖果分割)

Algorithm 不同组合算法(糖果分割),algorithm,xor,Algorithm,Xor,昨天我参加了谷歌代码堵塞大赛。有个糖果分割的问题。 我设计了一个算法,基本上尝试Patrick's pile和Sean's pile的所有不同组合,检查它们是否具有相同的Patrick值,最后选择能够最大化Sean份额的组合。该算法适用于小的输入文件。对于大的一个,我遇到了内存问题,输出从未出现过。我相信,解决这个问题的另一种方法不需要考虑所有的组合。有人能帮忙吗?对于较小的输入,糖果的数量很少(最多15个)。对所有可能情况的搜索将包括2^15=32768可能性,可在毫秒左右的时间内进行检查。

昨天我参加了谷歌代码堵塞大赛。有个糖果分割的问题。


我设计了一个算法,基本上尝试Patrick's pile和Sean's pile的所有不同组合,检查它们是否具有相同的Patrick值,最后选择能够最大化Sean份额的组合。该算法适用于小的输入文件。对于大的一个,我遇到了内存问题,输出从未出现过。我相信,解决这个问题的另一种方法不需要考虑所有的组合。有人能帮忙吗?

对于较小的输入,糖果的数量很少(最多15个)。对所有可能情况的搜索将包括2^15=
32768
可能性,可在毫秒左右的时间内进行检查。但是有多达1000个糖果(大量投入),可能的组合数最多可达2^1000=
1071508607186267320948425049060000181056140481170553336074437503883701051124936122493198378815695581275946729175146825825187145285692314043598457757469857480334567482423098542107460562371141875418215364749835811267398767559165594607762914571196477676542176604298526286720566803376
。现在这个数字有点太大了,即使你运行这个程序几年,你也不会得到结果

有一些观察结果有助于为此制定有效的计划:

  • 正如@Protostome指出的,Patrick的和实际上是一个异或运算
  • 正如@Protostome所指出的,如果它是可解的,那么所有糖果的xor将是0。原因是:如果两个分区中可能有相同的xor和,那么两个分区的xor将是
    a xor a=0
  • 如果可以进行分区,那么所有糖果的xor和为0。但是,如果我们从整个糖果集中删除一个糖果,它将变为非零。特别是,

也就是说,我们可以通过从整个集合中取出一颗糖果,将集合分成两部分。为了最大化左半部分的算术和,我们必须取最小值的糖果。所以,较高的一堆糖果的算术总和是所有糖果的总和——最低值

因此,我们:

  • 如果所有糖果的xor为零,则它是可解的
  • 若它是可解的,那个么sum就是整个列表的和——最小值

  • 哇,我踢自己,我已经意识到所有值的每一个第I位的总和都需要是偶数-这足以成功地解决这个大问题-但我没有意识到,我可以只对所有值进行异或,而不是找到每一位总和的奇偶性!哦!
       c1 xor c2 xor ... xor ci-1 xor ci xor ci+1 xor ... xor cn = 0
    => c1 xor c2 xor ... xor ci-1     xor    ci+1 xor ... xor cn = ci