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

如何输出和为目标值的组合对应的原输入列表索引?

解决组合求和中的索引输出错误问题

我明白你的问题了——你的脚本能正确找到和为目标值的数值组合,但输出的索引是临时列表的位置,不是原输入数组的真实索引。咱们来一步步修复这个问题。

问题根源

你当前代码里的index = [[num,indices] for indices,num in enumerate(partial)]这行是关键错误:enumerate(partial)得到的是partial这个临时列表里元素的位置(比如partial=[2,4]时,索引是0和1),而不是这些元素在原输入数组中的原始索引。

修复方案:跟踪原始索引

我们需要在递归过程中始终跟踪每个数值对应的原数组索引,而不是只跟踪数值本身。这里有两种简洁的实现方式:

方法1:传递原始索引参数(推荐)

这种方法通过start_idx避免重复组合,同时直接收集原数组索引:

numbers = [1,2,3,4,5]
target = 6

def calc_combo(start_idx, input_nums, target_sum, partial_vals=[], partial_indices=[]):
    total = sum(partial_vals)
    
    # 找到符合条件的组合,输出索引和数值
    if total == target_sum:
        print(f"{partial_indices} = {partial_vals} = {target_sum}")
        return
    # 总和超过目标,直接返回
    if total >= target_sum:
        return
    
    # 从start_idx开始遍历,避免重复组合
    for i in range(start_idx, len(input_nums)):
        num = input_nums[i]
        # 递归调用:下一次从i+1开始,添加当前数值和索引到partial
        calc_combo(i + 1, input_nums, target_sum, partial_vals + [num], partial_indices + [i])

# 初始调用:从索引0开始
calc_combo(0, numbers, target)

运行后输出:

[0, 1, 2] = [1, 2, 3] = 6
[0, 4] = [1, 5] = 6
[1, 3] = [2, 4] = 6

方法2:绑定数值与原始索引

这种方法把数值和原始索引打包成元组,在递归中传递:

numbers = [1,2,3,4,5]
target = 6

def calc_combo(numbers_with_indices, target_sum, partial=[]):
    total = sum(num for num, idx in partial)
    
    if total == target_sum:
        # 提取原始索引和数值列表
        indices = [idx for num, idx in partial]
        values = [num for num, idx in partial]
        print(f"{indices} = {values} = {target_sum}")
        return
    if total >= target_sum:
        return
    
    for i in range(len(numbers_with_indices)):
        current_num, current_idx = numbers_with_indices[i]
        remaining = numbers_with_indices[i+1:]
        calc_combo(remaining, target_sum, partial + [(current_num, current_idx)])

# 初始调用:把数值和原始索引绑定
calc_combo([(num, idx) for idx, num in enumerate(numbers)], target)

这个方法的输出和上面完全一致,适合习惯用元组打包数据的场景。

针对你的示例验证

如果输入是([1,2,3,4], target_sum=6),把numbers改成[1,2,3,4]后运行代码,会输出:

[0, 1, 2] = [1, 2, 3] = 6
[1, 3] = [2, 4] = 6

完全符合你的期望。

内容的提问来源于stack exchange,提问作者Sean H.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:48:57