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

基于给定因数高效拆分数字并最大化最小权重的算法

嘿,这个问题挺有意思的——本质上是要在满足总和约束的前提下,让所有权重里的最小值尽可能大,说白了就是要尽可能“公平”地分配这个数字到各个因数的倍数上。我来分享一下高效的解法思路和实现:

核心思路拆解

我们的目标是让所有权重w₁,w₂,...,wₙ尽可能接近,这样最小的那个权重才能达到最大可能值。关键步骤分两步:先找到所有权重能共同达到的最高基准值,再把剩余的“零头”合理分配出去。

1. 确定基准权重

首先计算所有因数的总和S = sum(given_factors),然后用目标数字Z除以S取整数部分,得到基准权重k = Z // S。这一步的逻辑很直接:如果所有权重都取k,那么总和是k*S,这是不超过Z的最大“均衡”总和。要是尝试把基准值设为k+1,总和(k+1)*S肯定会超过Z,根本满足不了等式。

2. 分配剩余的余数

算出余数R = Z - k*S后,我们要把这部分数值分配到各个权重上。这里的原则是尽量让权重保持均衡(当然,只要最小值不低于k,任何分配都符合要求,但均衡分配更符合直觉)。

我推荐的分配策略是循环遍历因数,每次给当前因数的权重加1(只要余数够),这样能让权重增长更均匀。比如题目里的例子,余数是4,我们循环给最小的因数加1(用掉1),再给下一个因数加1(用掉2),再回到最小的因数加1(用掉1),刚好把余数用完,就得到了示例里的[6,5,4]。

代码实现(Python)

下面是对应这个思路的代码,完全贴合题目示例的输出:

def evenly_split_a_number_with_factors(number, given_factors):
    if not given_factors:
        return []
    
    total_factors = sum(given_factors)
    base_weight = number // total_factors
    remainder = number - base_weight * total_factors
    weights = [base_weight] * len(given_factors)
    
    # 循环分配余数,让权重更均衡
    idx = 0
    while remainder > 0:
        current_factor = given_factors[idx]
        if remainder >= current_factor:
            weights[idx] += 1
            remainder -= current_factor
        idx = (idx + 1) % len(given_factors)
    
    return weights

# 测试题目示例
number = 32
given_factors = [1,2,4]
print(evenly_split_a_number_with_factors(number, given_factors))  # 输出 [6,5,4]
验证与扩展

拿题目里的例子验证:

  • 因数总和是7,32除以7得4,基准权重是4,总和4*7=28,余数4
  • 循环分配余数:给第一个因数加1(剩3)→ 第二个加1(剩1)→ 第一个再加1(剩0),最终权重就是[6,5,4],刚好满足6*1 +5*2 +4*4=32,而且最小权重是4,这是能达到的最大值(要是想让最小权重是5,总和至少是5*7=35>32,根本不可能)。

这个解法的时间复杂度非常低,接近O(n)——因为余数R肯定小于因数总和S,所以循环次数不会太多,处理大数字也毫无压力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:13:54