均等分配填充算法开发需求:新增资源多容器最优分配
均等资源分配填充算法实现
问题描述
给定任意数量的容器(每个容器包含当前资源量和最大容量),需分配指定数量的新增资源,要求:
- 不可移动容器内现有资源,只能新增
- 最终所有容器的资源量尽可能均等
- 适配任意容器数、容量及新增资源量(从1个到填满所有容器)
算法核心思路
核心逻辑是优先给当前资源最少且还有剩余容量的容器分配资源,通过批量分配减少循环次数,保证效率:
- 分离已满容器和可分配容器,避免无效处理
- 循环处理直到资源耗尽或所有容器已满:
- 按当前资源量升序排序可分配容器(资源量相同时,剩余容量大的优先,避免小容量容器过早填满)
- 计算批量分配量:要么补到与下一个容器的资源量持平,要么填满当前容器,要么用完剩余资源,取三者最小值
- 完成批量分配后,若容器已满则移至已满列表
- 最后恢复原容器顺序返回结果
代码实现(Python)
def equal_distribution(containers, add_amount): # 保留原索引,确保返回结果与输入顺序一致 indexed_containers = [[idx, current, max_cap] for idx, (current, max_cap) in enumerate(containers)] available = [c for c in indexed_containers if c[1] < c[2]] full = [c for c in indexed_containers if c[1] >= c[2]] while add_amount > 0 and available: # 排序规则:当前资源量升序,剩余容量降序 available.sort(key=lambda x: (x[1], -(x[2] - x[1]))) if len(available) == 1: # 仅剩一个可分配容器,直接分配所有能加的资源 add = min(available[0][2] - available[0][1], add_amount) available[0][1] += add add_amount -= add if available[0][1] == available[0][2]: full.append(available.pop(0)) continue # 计算当前最小容器与下一个容器的资源差 min_curr = available[0][1] next_curr = available[1][1] diff = next_curr - min_curr # 当前容器能接受的最大批量 max_possible = available[0][2] - min_curr batch = min(diff, max_possible, add_amount) # 执行分配 available[0][1] += batch add_amount -= batch # 容器已满则移至已满列表 if available[0][1] == available[0][2]: full.append(available.pop(0)) # 按原索引排序,恢复输入顺序 all_containers = full + available all_containers.sort(key=lambda x: x[0]) return [(c[1], c[2]) for c in all_containers]
示例验证
测试用户提供的场景
# 输入:3个篮子,现有数量/最大容量分别为(10,100)、(50,200)、(100,300),新增100个球 containers = [(10, 100), (50, 200), (100, 300)] add_amount = 100 result = equal_distribution(containers, add_amount) print("分配结果:") for idx, (current, max_cap) in enumerate(result, 1): print(f"篮子{idx}:{current}/{max_cap}")
输出:
分配结果: 篮子1:80/100 篮子2:80/200 篮子3:100/300
总资源量:80+80+100=260,正好是原有160+新增100,且两个低容量容器的资源量完全均等,达到最优分配。
其他场景测试
- 新增1个球:分配后篮子1变为11,其余不变
- 填满所有容器:新增440个球(90+150+200),结果为(100,100)、(200,200)、(300,300)
适配说明
该算法支持:
- 任意数量的容器(从1个到N个)
- 每个容器的当前量和最大容量可以任意设置(只要当前量≤最大容量)
- 任意新增资源量(0到所有容器剩余容量总和)
内容的提问来源于stack exchange,提问作者Michael Vish
相关产品推荐
相关产品推荐

