组合问题,房间配置

时间:2011-04-12 14:15:56

标签: algorithm math combinations

假设我有一堆酒店房间,适合1,2或3人。

一组4人愿意预订,我想向他们展示所有可能的配置,因为不同的配置有不同的价格。

可能的组合包括:

  • 4 * 1人房
  • 2 * 2人房间
  • 1 * 3人房+ 1 * 1人房
  • etcetera,etcetera

我如何计算不同的分组?

更复杂的是,这些人中的一些人可能是儿童,应该总是与成人在一个房间里合并。我想我应该只计算所有组合并滤除那些不满足这种约束的组合。

任何提示,提示或指示?

1 个答案:

答案 0 :(得分:2)

问题的表达方式表明房间类型的数量很少,所需的团体规模也是最大的。

考虑到这一点,我会使用深度优先搜索和memoization。在Python中:

@memoized
def search(n, room_types):
  ret = set()
  for t in room_types:
    if t >= n:
      ret.add((t,))
    else:
      for cfg in search(n - t, room_types):
        if sum(cfg) >= n:
          ret.add(cfg)
        else:
          ret.add(tuple(sorted(list(cfg) + [t])))
  return ret

print sorted(search(4, (1, 2, 3)))

这会产生:

[(1, 1, 1, 1), (1, 1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]

@memoized来自here