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

如何实现优先用3的数字分解及优化配送最少趟数函数

两个关联技术问题的解决方案

一、数字分解为3和2的倍数之和(优先使用3)

需求:编写函数将大于1的数字分解为尽可能多的3与2的倍数之和,返回格式如3:3, 2:1(对应3×3+2×1=11)。

实现代码

def get_components(n):
    f3 = 0
    f2 = 0
    # 当n除以3余1时,减少1个3,替换为2个2(3+1=4=2×2)
    if n % 3 == 1:
        f3 = (n // 3) - 1
        f2 = 2
    # 当n除以3余2时,保留现有3的数量,补充1个2
    elif n % 3 == 2:
        f3 = n // 3
        f2 = 1
    # 能被3整除的情况,全用3
    else:
        f3 = n // 3
        f2 = 0
    return f"3:{f3}, 2:{f2}"

逻辑说明

  • 核心原则是优先使用3,以最大化3的数量
  • 若n%3=1:直接用3会剩余1,因此减少1个3,剩余的数值恰好是4,可拆为2个2
  • 若n%3=2:剩余的2直接用1个2即可
  • 能被3整除时,全部使用3

二、优化getMinimumTrips配送趟数计算函数

原问题缺陷

原函数未处理包裹数量既不能被2也不能被3整除的情况(如5、7等),需结合上述数字分解逻辑完善,以计算最少配送趟数。规则:每趟可配送2个或3个同重量包裹,若存在仅1个的包裹则返回-1。

优化后代码

from collections import Counter

def getMinimumTrips(weights):
    weights_counted = Counter(weights)
    minimum_trips = 0
    for count in weights_counted.values():
        # 单个包裹无法完成配送,直接返回-1
        if count == 1:
            return -1
        # 根据数量计算最少趟数,优先用3个一趟的方式
        if count % 3 == 0:
            minimum_trips += count // 3
        elif count % 3 == 1:
            # 余1时,拆为2个2趟 + 剩余数量的3趟
            minimum_trips += (count - 4) // 3 + 2
        elif count % 3 == 2:
            # 余2时,加1个2趟 + 现有数量的3趟
            minimum_trips += count // 3 + 1
    return minimum_trips

# 测试示例
print(getMinimumTrips([2, 4, 6, 6, 4, 2, 4]))  # 输出:3(重量2有2个→1趟;重量4有3个→1趟;重量6有2个→1趟)

优化说明

  • 遍历每个重量对应的包裹数量,若数量为1直接返回-1
  • 针对不同余数情况计算最少趟数:
    • 能被3整除:直接除以3得到趟数
    • 余1时:将4个包裹拆为2趟2个的,剩余数量用3个一趟的方式
    • 余2时:用1趟2个的,剩余数量用3个一趟的方式
  • 始终优先使用3个一趟的配送方式,保证总趟数最少

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:35:18