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

求满足a*n +b*m ≤s的最大a+b值的高效解法咨询

嘿,这个问题其实不用纠结“刚好等于s”的特殊情况,咱们换个思路直接瞄准最大化a+b的目标就行,简单又高效!

核心思路

要让a+b最大,本质是在a*n + b*m ≤ s的约束下,尽可能多地累加a和b的数量总和。这里有个实用的优化技巧:枚举其中一个变量的可能取值范围,计算对应另一个变量的最大值,然后记录总和的最大值。

为了减少枚举次数,我们可以选择枚举取值范围更小的那个变量:比如如果n比m大,那s//n的结果肯定比s//m小,这时候枚举a的次数就更少;反之就枚举b。这样整个算法的时间复杂度是O(min(s/n, s/m)),哪怕n和m很大,也能快速算出结果。

示例代码(Python)

def max_total_ab(n, m, s):
    max_sum = 0
    # 选枚举次数少的变量来循环,提升效率
    if n > m:
        # 枚举b的所有可能取值
        max_b = s // m
        for b in range(max_b + 1):
            remaining = s - b * m
            a = remaining // n
            current_sum = a + b
            if current_sum > max_sum:
                max_sum = current_sum
    else:
        # 枚举a的所有可能取值
        max_a = s // n
        for a in range(max_a + 1):
            remaining = s - a * n
            b = remaining // m
            current_sum = a + b
            if current_sum > max_sum:
                max_sum = current_sum
    return max_sum

举个例子验证

比如n=3,m=5,s=20:

  • 枚举a从0到6(因为20//3=6):
    • a=5时,剩余20-15=5,b=1,总和5+1=6
    • a=6时,剩余20-18=2,b=0,总和6+0=6
  • 最终最大总和就是6,完全符合预期,不管有没有余数都能正确处理。

为什么这个方法更好?

相比你之前只处理“恰好等于s”的复杂逻辑,这个方法:

  • 逻辑简单直观,不容易出错
  • 自动兼容有余数的情况,不用额外写分支处理
  • 效率极高,枚举次数最多也不会超过s//min(n,m),对于大数值也能快速出结果

内容的提问来源于stack exchange,提问作者Marked as Duplicate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:12:10