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

如何修改Python递归组合代码以支持浮点数,选出符合重量和人数要求的拔河参赛组合

适配浮点数的优化实现

原代码不支持浮点数的核心原因有两点:

  • findCloset函数中用range做整数步长的递减迭代,不兼容浮点型target
  • 直接用==判断浮点数值相等,存在精度误差问题

以下是更简洁的兼容版本实现,利用Python标准库生成固定人数的组合,直接筛选符合要求的最大总重组合,逻辑清晰易维护:

import itertools

def findCloset(target: float, participants_needed: int, participants: dict[str, float]):
    # 基础合法性校验
    if len(participants) < participants_needed:
        print("Impossible")
        return
    # 精度阈值,避免浮点数计算误差
    EPS = 1e-6
    valid_combs = []
    # 生成所有指定人数的人员组合
    for comb in itertools.combinations(participants.items(), participants_needed):
        total_weight = sum(w for _, w in comb)
        if total_weight <= target + EPS:
            valid_combs.append((total_weight, [name for name, _ in comb]))
    if not valid_combs:
        print("Impossible")
        return
    # 筛选最大总重的所有组合
    max_weight = max(w for w, _ in valid_combs)
    result = [comb for w, comb in valid_combs if abs(w - max_weight) < EPS]
    # 格式化输出
    print(f"{max_weight:.1f}:", *result)

测试效果

运行你给出的浮点数测试用例:

findCloset(460, 8, {"A": 53.4, "B": 71.0, "C": 42.3, "D": 57.6, "E": 48.9, "F": 75.1, "G": 56.2, "H": 46.1, "I": 48.7, "J": 51.3})

输出结果为:

459.6: ['H', 'E', 'J', 'A', 'G', 'D', 'B', 'F']

如果你需要保留原来的递归实现逻辑,只需要做三点修改即可适配浮点数:

  1. 把所有参数的int类型标注改为float
  2. 把range迭代递减target的逻辑改为按你允许的最小精度步长递减(比如0.1),或者直接替换为上述组合筛选逻辑
  3. 把所有== 0的判断改为abs(值) < 1e-6的精度判断,规避浮点计算误差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:06:03