如何修改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']
如果你需要保留原来的递归实现逻辑,只需要做三点修改即可适配浮点数:
- 把所有参数的int类型标注改为float
- 把
range迭代递减target的逻辑改为按你允许的最小精度步长递减(比如0.1),或者直接替换为上述组合筛选逻辑 - 把所有
== 0的判断改为abs(值) < 1e-6的精度判断,规避浮点计算误差
内容的提问来源于stack exchange,提问作者Clydinite
相关产品推荐
相关产品推荐

