婚宴场景下禁拼桌的宾客桌位最优最小座位分配方法

上图为婚宴接待现场的可用桌位,现需为不同宾客团体预留对应桌位,要求分配方案达到最优效果。
核心需求为计算面向宾客群体的最优最小座位分配方案。
规则说明:单个宾客团体可同时占用多张餐桌,但严禁不同团体共用同一张餐桌(即不允许拼桌)。举例:若某6人规模的宾客团体需要安排座位,应当如何计算得到最优的座位分配结果。
问题本质
这是典型的约束下最优资源匹配问题,硬约束为不同团体不得拼桌,优化目标为全场景空置座位最少,实现桌位资源利用率最大化。
分配实现逻辑
- 前置准备:先统计所有可用桌的单桌容量,将桌位按容量分类标记,同时将待分配的宾客团体按人数从大到小排序,优先满足大团体需求,避免大团体因小桌被提前占用被迫拆分多桌造成额外空位浪费。
- 单团体分配优先级(以6人团体为例):
- 第一优先级:匹配容量刚好为6人的单桌,此时空置座位为0,为最优解,直接锁定分配即可。
- 第二优先级:若无刚好匹配的单桌,筛选所有容量≥6人的单桌,选择其中容量最小的桌位(比如同时有8人桌、10人桌可选时,选8人桌,仅空置2个座位,浪费远小于选10人桌)。
- 第三优先级:若所有单桌容量都小于6人,遍历所有可选的多桌组合,筛选总容量≥6人的组合,选择总空置位最少的组合分配(比如同时有「4人桌+3人桌」总容量7空置1位、「2张4人桌」总容量8空置2位两种选项时,优先选前者)。
- 迭代校验:每完成一个团体的分配,就从可用桌池里移除已分配的桌位,再进行下一个团体的匹配,直到所有团体分配完成。
核心逻辑参考代码
def get_optimal_assignment(group_size: int, available_tables: list[int]) -> list[int]: """ 为单个宾客团体匹配最优桌位组合 :param group_size: 团体人数 :param available_tables: 可用桌位的容量列表,例[4,4,6,8,10] :return: 最优分配的桌位容量列表 """ # 优先匹配单桌最优解 eligible_single = [cap for cap in available_tables if cap >= group_size] if eligible_single: return [min(eligible_single)] # 单桌容量不足时,遍历多桌组合找空位最少的方案 from itertools import combinations min_waste = float('inf') best_combo = None # 按组合使用的桌数从小到大遍历,优先少用桌 for table_count in range(2, len(available_tables)+1): for combo in combinations(available_tables, table_count): total_cap = sum(combo) if total_cap >= group_size: waste = total_cap - group_size if waste < min_waste: min_waste = waste best_combo = list(combo) # 找到当前桌数下的最优解即可终止,优先少占桌 if best_combo: break return best_combo
内容的提问来源于stack exchange,提问作者Saleem K K
相关产品推荐
相关产品推荐

