You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

均等分配填充算法开发需求:新增资源多容器最优分配

均等资源分配填充算法实现

问题描述

给定任意数量的容器(每个容器包含当前资源量和最大容量),需分配指定数量的新增资源,要求:

  • 不可移动容器内现有资源,只能新增
  • 最终所有容器的资源量尽可能均等
  • 适配任意容器数、容量及新增资源量(从1个到填满所有容器)

算法核心思路

核心逻辑是优先给当前资源最少且还有剩余容量的容器分配资源,通过批量分配减少循环次数,保证效率:

  1. 分离已满容器和可分配容器,避免无效处理
  2. 循环处理直到资源耗尽或所有容器已满:
    • 按当前资源量升序排序可分配容器(资源量相同时,剩余容量大的优先,避免小容量容器过早填满)
    • 计算批量分配量:要么补到与下一个容器的资源量持平,要么填满当前容器,要么用完剩余资源,取三者最小值
    • 完成批量分配后,若容器已满则移至已满列表
  3. 最后恢复原容器顺序返回结果

代码实现(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:50:25