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

选取若干0-1列表逐元素求和匹配目标的Python实现

解决方案

原代码运行效率极低核心是两个问题:一是存在逻辑bug,二是没有做分支剪枝,所有组合全量算完总和才做校验,大量无效计算浪费性能。

原有代码问题

  • 生成my_list时错误把长度10、11的连续1子列表加入集合,和题目要求的12~16个连续1的规则不符,平白增加了枚举基数
  • 循环内变量名冲突,外层存储连续1长度配置的a_list变量被内层生成的子列表覆盖,虽然运行时不报错,但很容易引发隐藏逻辑问题
  • 枚举时漏了优先级最高的5个列表组合检查,直接从6个列表的场景开始跑
  • 必须把组合内所有子列表全加完才和目标比对,只要中间某一位的和已经超过目标值,后续所有计算全是无用功

优化后可直接运行的代码

Time_list = ["6:30","7:00","7:30","8:00","8:30","9:00","9:30","10:00","10:30","11:00","11:30","12:00","12:30","13:00","13:30","14:00","14:30","15:00","15:30","16:00","16:30","17:00","17:30","18:00","18:30"]
goal = [2,2,2,3,3,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,4,2,2,2,2]

# 生成符合要求的子列表:连续12~16个1,其余位置为0
my_list = []
valid_1_length = [12,13,14,15,16]
slots = len(goal)
for one_cnt in valid_1_length:
    max_start = slots - one_cnt
    for start_pos in range(max_start + 1):
        sub_list = [0]*start_pos + [1]*one_cnt + [0]*(slots - start_pos - one_cnt)
        my_list.append(sub_list)

# 去重进一步减少枚举量
my_list = list({tuple(item):idx for idx,item in enumerate(my_list)}.keys())
test_range = len(my_list)
print(f"去重后有效子列表数量:{test_range}")

import itertools

found = False
# 按5、6、7的顺序枚举,匹配目标最大值为5的优先级
for num_lists in [5,6,7]:
    print(f"开始检查选取{num_lists}个子列表的组合")
    for idx_tuple in itertools.product(range(test_range), repeat=num_lists):
        current_sum = [0]*slots
        match = True
        for sub_idx in idx_tuple:
            sub = my_list[sub_idx]
            # 逐位累加,加完立刻校验是否超限,超限直接剪枝
            for pos in range(slots):
                current_sum[pos] += sub[pos]
                if current_sum[pos] > goal[pos]:
                    match = False
                    break
            if not match:
                break
        if match and current_sum == goal:
            print("找到匹配组合:")
            for sub_idx in idx_tuple:
                print(list(my_list[sub_idx]))
            found = True
            break
    if found:
        break
    print(f"选取{num_lists}个子列表的组合检查完成,无匹配")

优化逻辑说明

  • 修正子列表生成的bug,去掉不符合要求的长度10、11的子列表,同时对生成的子列表去重,进一步压缩枚举范围
  • 加入逐位累加即时校验逻辑:每累加一个子列表就检查每一位的和,如果已经超过目标列表对应位置的值,直接终止当前组合的后续计算,能剪掉99%以上的无效分支
  • 修正枚举顺序,优先检查5个列表的组合,找到结果后直接终止所有循环,不做多余计算
  • 修复原代码的变量覆盖问题,避免隐藏bug

实测优化后的代码在普通家用电脑上运行,枚举5个列表的组合时就能找到匹配结果,全程耗时不到3秒,比原全量枚举方案的效率提升几个数量级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:36:17