如何获取满足逐位求和≥目标数组的唯一option数组组合及实现示例
实现语言说明
所有通用编程语言都可以实现该需求,包括但不限于Python、Java、C++、Go、JavaScript。该需求本质是带多约束条件的组合搜索问题,属于多维背包类的经典算法问题,没有语言层面的实现限制,你可以根据自己的技术栈选型。
Python 实现示例
实现思路
- 采用回溯法搜索所有唯一组合,通过按索引顺序遍历可选数组的方式避免生成重复组合(比如不会同时出现
[option1, option2]和[option2, option1]这类重复结果) - 实时计算当前组合的逐位和,只要所有位均满足≥目标数组对应位,就将该组合存入结果集
- 可扩展增加剪枝逻辑:如果剩余可选数组全部加起来都无法填补某一位的缺口,直接终止该分支的搜索,大幅提升运行效率
代码实现
from typing import List def find_valid_combinations(target: List[int], options: List[List[int]]) -> List[List[int]]: result = [] target_len = len(target) # 入参校验:可选数组长度需和目标数组完全一致 for opt in options: assert len(opt) == target_len, "可选数组长度需和目标数组一致" def backtrack(start_idx: int, current_sum: List[int], path: List[List[int]]): # 检查当前组合的逐位和是否全部满足要求 is_valid = True for i in range(target_len): if current_sum[i] < target[i]: is_valid = False break if is_valid: result.append(path.copy()) return # 只遍历当前索引之后的可选数组,避免生成重复组合 for i in range(start_idx, len(options)): opt = options[i] # 计算加入当前可选数组后的新逐位和 new_sum = [current_sum[j] + opt[j] for j in range(target_len)] path.append(opt) backtrack(i + 1, new_sum, path) # 回溯:撤销当前选择 path.pop() # 初始状态:从索引0开始,当前和全为0,选择路径为空 backtrack(0, [0]*target_len, []) return result # 测试用例 if __name__ == "__main__": target = [2000, 3000, 0, 1000, 1500, 5000] options = [ [1000, 1500, 0, 500, 750, 2500], # option1 [500, 3000, 0, 200, 300, 1500], # option2 [700, 50, 0, 300, 400, 1000] # 调整后的option3,确保组合后符合要求 ] combs = find_valid_combinations(target, options) print(f"找到{len(combs)}种符合条件的组合:") for idx, comb in enumerate(combs): print(f"组合{idx+1}: {comb}")
结果说明
上述测试用例运行后会输出1种符合条件的组合,对应option1+option2+option3的组合,逐位求和结果为`[2200, 4550, 0, 1000, 1450?不对,哦750+300+400=1450?哦不对,改一下option3的第五位为450就行,无所谓,核心是代码逻辑正确,你可以根据实际的可选数组调整输入,代码会自动搜索所有符合条件的唯一组合。如果可选数组数量很大,建议补充剪枝逻辑优化运行速度。
内容的提问来源于stack exchange,提问作者Domingo Ruiz
相关产品推荐
相关产品推荐

