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。但是,如果我们从整个糖果集中删除一个糖果,它将变为非零。特别是,
哇,我踢自己,我已经意识到所有值的每一个第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