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

三个整数按比例缩放取整总和对齐问题:如何实现分配后总和为128

整数按比例分配总和对齐解法

适用方案:最大余数法(汉密尔顿分配法)

该方案全程使用整数运算,无浮点数精度问题,也不需要硬编码补差值,完全满足需求。

核心逻辑

  • 先计算所有原始数值的总求和
  • 对每个数值,用整数除法计算(数值 * 目标总和) // 总求和得到基础分配值,同时取模得到对应的余数
  • 计算基础分配值总和和目标总和的差值diff
  • 将所有数值按余数从大到小排序,前diff个数值的基础分配值各加1,最终总和就会完全对齐目标值

代码实现

def proportional_allocate(values, target_sum):
    total = sum(values)
    base = []
    remainders = []
    for v in values:
        product = v * target_sum
        base.append(product // total)
        remainders.append(product % total)
    diff = target_sum - sum(base)
    # 按余数倒序取对应索引
    sorted_idx = sorted(range(len(values)), key=lambda x: -remainders[x])
    for i in sorted_idx[:diff]:
        base[i] += 1
    return base

# 调用测试
a, b, c = 1541, 1575, 1512
res = proportional_allocate([a, b, c], 128)
print(res)  # 输出 [43, 43, 42]
print(sum(res))  # 输出 128

场景计算验证

  1. 原始总求和:1541 + 1575 + 1512 = 4628
  2. 基础分配值:分别为1541*128//4628=42、1575*128//4628=43、1512*128//4628=41,总和为126,差值为2
  3. 余数计算:三个数对应的余数分别为2872、2596、3788,按倒序排序后前两位对应c和a
  4. 给c和a的基础值各加1,最终结果为43、43、42,总和刚好为128

内容的提问来源于stack exchange,提问作者kadir_cakir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:48:00