假设我有一堆酒店房间,适合1,2或3人。
一组4人愿意预订,我想向他们展示所有可能的配置,因为不同的配置有不同的价格。
可能的组合包括:
我如何计算不同的分组?
更复杂的是,这些人中的一些人可能是儿童,应该总是与成人在一个房间里合并。我想我应该只计算所有组合并滤除那些不满足这种约束的组合。
任何提示,提示或指示?
答案 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。