【发布时间】:2017-07-06 06:11:38
【问题描述】:
我遇到了一个算法问题,但我无法找出比蛮力更好的方法,也无法将其简化为一个更清楚的问题。有什么提示吗?
有 N 袋不同尺寸和 N 种物品。每种类型的物品都属于一个袋子。每种类型都有很多物品,每个物品的尺寸可能不同。最初,这些物品随机分布在所有袋子中。我们必须将这些物品放在各自的袋子里。但是,我们一次只能操作一对袋子,方法是交换物品(尽可能多地),然后进行下一对。 目的是减少对的总数。 编辑:目的是找到一个转移序列,使所涉及的袋对总数最小化
澄清:
袋子不是任意大的(如果有帮助,您可以假设袋子和物品的大小是 0 到 1000 之间的整数)。您会经常遇到由于其中一个袋子的容量有限而无法交换 2 个袋子之间的所有物品的情况。这是算法需要进行优化的地方。也许,如果先交换另一对包,则可以一次完成当前的交换。为了说明这一点,让我们分别考虑袋子 A、B 和 C 及其项目 1、2、3。括号中的数字是尺寸。
A(10) : 3(8)
B(10): 1(2), 1(3)
C(10): 1(4)
掉期订单可以是 AB、AC、AB 或 AC、AB。后者是最佳的,因为交换的数量较少。
【问题讨论】:
-
答案需要准确吗?
-
这似乎是一个排序问题,根据条件,我认为您可以使用合并排序之类的方法将项目安排在各自的包中。
-
@rhino2rhonda:对包或物品的大小有任何限制吗?我假设所有尺寸都是正数。但也许有最大尺寸?也许最小尺寸大于零?也许大小必须是整数? (请使用
@Richard回复,因此我会收到您已这样做的通知。) -
@Richard,我明白你的担忧。我添加了假设和一个例子来澄清。请查看我上次的编辑。
-
几个问题:a) 是否保证某一类的所有物品都可以放入他们的包中? b)是否有可能假设一个无限的“外部”袋子用于临时存储? c) 是否保证总是有解决方案? (我认为如果 a) 和 b) 的答案是“是”,这也将自动成立,尽管我不确定 b) 是否必要)。
标签: algorithm