如何用Python编写代码计算给定数字可相加得到目标值的所有组合
需求可行性结论
该需求完全可以实现,你提到的用1、2、3凑出和为6的场景确实存在24种符合要求的组合,可通过回溯算法实现对应功能。
实现思路
这个需求属于可重复选取元素的组合求和穷举问题,实现逻辑如下:
- 用回溯递归逐层尝试选取数字,每次递归记录当前已选的数字序列、当前累计和
- 累计和等于目标值时,将当前序列转成字符串存入结果集
- 累计和超过目标值时直接剪枝返回,减少无效计算
- 为了避免生成重复排列(例如把
123和132判定为两种不同组合,不符合你给出的样例的非降序规则),每次选取数字时仅从当前下标及之后的数字中选择,保证生成的序列都是非降序的,不会出现重复的排列类结果
实现代码
def find_target_combinations(numbers, target_sum): result = [] # 先对数字排序,保证后续生成的序列是非降序的 numbers.sort() def backtrack(start_index, current_total, current_path): # 累计和等于目标值,保存结果 if current_total == target_sum: result.append(''.join(map(str, current_path))) return # 累计和超过目标值,直接剪枝 if current_total > target_sum: return # 从start_index开始选数,避免生成重复组合 for i in range(start_index, len(numbers)): select_num = numbers[i] current_path.append(select_num) backtrack(i, current_total + select_num, current_path) # 回溯撤销选择 current_path.pop() backtrack(0, 0, []) return result # 测试你的样例场景 nums = [1, 2, 3] target = 6 combinations = find_target_combinations(nums, target) # 逐行输出所有组合 for comb in combinations: print(comb) # 输出总数量验证 print(f"总组合数:{len(combinations)}")
运行验证
代码运行后会输出你给出的样例内容,包括
111111、11112、1113、123等所有符合要求的组合,最终打印的总组合数为24,和你描述的场景数据完全匹配。
内容的提问来源于stack exchange,提问作者Abolfazl Malekpour
相关产品推荐
相关产品推荐

