Python脚本求助:地板预算最优组合计算问题
问题修正与解决方案
你当前的代码完全搞错了需求逻辑:itertools.combinations是用来选不重复的单价组合然后求和,但实际你需要给每个房间分配任意单价(同一个单价可以给多个房间用),计算的是「房间面积×对应单价」的总和,不是单价本身的和。另外你提到的“至少使用一种独特单价”,应该是指方案里不能所有房间都用同一种地板(也就是至少用两种不同单价),不然这个条件毫无意义。
直接上修正后的代码:
import itertools # 你的原始数据 floor_prices = [1.00, 1.40, 1.43, 1.58, 2.09, 2.97, 3.25, 3.99, 4.12, 4.29, 4.48] room_areas = [896, 132, 132, 120, 219, 88, 189, 41] max_budget = 3500 # 初始化最优结果 best_cost = 0 best_plan = None # 生成所有可能的单价分配方案:每个房间选一个单价(可重复) for price_assignment in itertools.product(floor_prices, repeat=len(room_areas)): # 计算总费用 total_cost = sum(area * price for area, price in zip(room_areas, price_assignment)) # 检查条件:不超预算,且至少用了两种不同单价 if total_cost <= max_budget and len(set(price_assignment)) >= 2: # 更新最优方案 if total_cost > best_cost: best_cost = total_cost best_plan = price_assignment # 输出结果 if best_plan: print(f"最优方案总费用: {best_cost:.2f} 美元") print("各房间地板单价分配:") for i, (area, price) in enumerate(zip(room_areas, best_plan), 1): print(f"房间{i}({area} 平方英尺): {price:.2f} 美元/平方英尺") else: print("没有满足条件的方案")
为什么你的代码不行?
combinations只能选不重复的单价,而实际场景中多个房间可以用同一种地板;- 你直接求和单价,而不是用「面积×单价」计算总费用,完全偏离了实际成本计算逻辑;
- 你要求
sum(seq) == target,但实际我们需要的是总费用不超过且最接近预算,而不是等于。
性能提示
因为有8个房间、11种单价,总共有11^8≈2.14亿种组合,直接跑可能有点慢。如果要优化,可以加剪枝逻辑:比如计算到某几个房间的费用后,加上剩余房间用最便宜地板的费用已经超预算,就直接跳过这个分支;或者用动态规划记录已有的费用组合,避免重复计算。
内容的提问来源于stack exchange,提问作者Kamran Noei
相关产品推荐
相关产品推荐

