Algorithm 组合数学问题,房间布局

Algorithm 组合数学问题,房间布局,algorithm,math,combinations,Algorithm,Math,Combinations,假设我有一大堆适合1、2或3个人住的酒店房间 一组4人想要预订,我想向他们展示所有可能的配置,因为不同的配置有不同的价格 可能的组合包括: 4*1人房 2*2人房 1*3人房+1*1人房 等等,等等 我如何计算不同的分组 更为复杂的是,其中一些人可能是儿童,他们应该始终与成年人在一个房间里。我想我应该计算所有的组合,过滤掉那些不满足这个约束的组合 有任何提示、提示或指示吗?问题的表述方式表明房间类型的数量很小,所需的最大群体规模也很小 考虑到这一点,我会使用深度优先搜索和记忆。在Python

假设我有一大堆适合1、2或3个人住的酒店房间

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

可能的组合包括:

  • 4*1人房
  • 2*2人房
  • 1*3人房+1*1人房
  • 等等,等等
我如何计算不同的分组

更为复杂的是,其中一些人可能是儿童,他们应该始终与成年人在一个房间里。我想我应该计算所有的组合,过滤掉那些不满足这个约束的组合


有任何提示、提示或指示吗?

问题的表述方式表明房间类型的数量很小,所需的最大群体规模也很小

考虑到这一点,我会使用深度优先搜索和记忆。在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)]

@memomed
来自。

这个问题的措辞表明房间类型的数量很小,所需的最大群体规模也很小

考虑到这一点,我会使用深度优先搜索和记忆。在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
来自。

这是一种p(n),但不完全是。(它本身只返回可能的房间数量。但也许你可以在本文中找到一些东西)谢谢,但我不认为是这样,因为房间大小可能会有所不同,例如,可能只有2人和4人的房间。可能是暴力。每次向一个房间添加一个人时,递归加上分支避免/删除重复项。这是一种P(n),但不完全是。(它本身只返回可能的房间数量。但也许你可以在本文中找到一些东西)谢谢,但我不认为是这样,因为房间大小可能会有所不同,例如,可能只有2人和4人的房间。可能是暴力。每次向一个房间添加一个人时,递归加上分支避免/删除重复项。谢谢,我认为这是朝着正确方向迈出的一步,但我怀疑儿童/成人约束很难应用于此输出,因为它描述了实际的人员组合,而不仅仅是人数。谢谢,我认为这是朝着正确方向迈出的一步,但我怀疑儿童/成人约束很难应用于此输出,因为它描述的是实际的人员组合,而不仅仅是人数。