Algorithm 将对象对排序到单独的容器中

Algorithm 将对象对排序到单独的容器中,algorithm,Algorithm,我有N个对象对(主副本/从副本),它们都具有相同的大小。我希望在M个存储箱之间分发副本,每个存储箱的容量不同,这样就不会有任何存储箱同时包含主副本和从副本 最有效的算法是什么?更重要的是,找出给定输入是否存在可能的解决方案的最有效算法是什么(而不是实际生成解决方案)?很难想象有比暴力更好的方法:通过降低剩余容量来跟踪优先级队列中的M个箱子,并将每个对象对添加到队列中的前两个容器中;重新平衡队列并重复。若M个料仓的总容量>=2*N,则存在解决方案 这似乎是复杂性O(N*logm) 注:对于正好三个

我有N个对象对(主副本/从副本),它们都具有相同的大小。我希望在M个存储箱之间分发副本,每个存储箱的容量不同,这样就不会有任何存储箱同时包含主副本和从副本


最有效的算法是什么?更重要的是,找出给定输入是否存在可能的解决方案的最有效算法是什么(而不是实际生成解决方案)?

很难想象有比暴力更好的方法:通过降低剩余容量来跟踪优先级队列中的M个箱子,并将每个对象对添加到队列中的前两个容器中;重新平衡队列并重复。若M个料仓的总容量>=2*N,则存在解决方案

这似乎是复杂性O(N*logm)

注:对于正好三个料仓,对于N>M1+M2,不存在解决方案,其中Mn是按范围为0..M的N的递减容量排序的料仓N的容量,而不考虑M0的容量

同样,对于2个箱子,只存在N的溶液,简单溶液为:

根据M个桶的容量按降序排序:x1、x2、…、xm

拾取最上面的两个存储桶,为该对分配一个对象,减小两个存储桶的可用容量,然后重新排列存储桶。您可以使用堆来跟踪存储桶,其复杂性接近O(n)


继续重复,直到所有对象都被分配。

算法听起来正确,但如果有一个容量为2*N的箱子,则没有解决方案。@user1532059:答案已更新,请同时注意两个和三个箱子的例外情况。可能会有更多的例外情况,问题是如何判断给定输入是否有解决方案?@hyrax:我不确定是否还有更多例外。你能为M>3想出一个特殊的例外吗?这个问题让我想起了游戏Nim,在这个游戏中,所有特殊情况都出现在底部。N=5,M=4,容量(M0)=100,容量(M1-3)=1