给定一个整数数组 nums 、一个数字 k、一个整数目标值 target,请问 nums 中是否存在 k 个元素使得其相加结果为 target,请输出所有符合条件且不重复的 k 元组的个数
输入:
第一行是 nums 取值:2 7 11 15
第二行是 k 的取值:2
第三行是 target 取值: 9
输出:
1
说明:
[2,7]满足,输出个数是 1
解题思路:
通过回溯法找出数组 nums 中符合要求的 k 元组,使其相加结果为 target,并统计符合条件且不重复的 k 元组个数。
回溯法python框架:
result= []
def backtrace(选择列表nums, 路径列表trace):
if 满足约束条件:
result.append(路径 trace.copy())
return
for 选择 in 选择列表nums:
做选择trace.append()
backtrace(剩余选择列表, 路径)
撤销选择trace.pop()
题解:
def combine(nums, target, k):
result = []
trace = []
def backtrace(nums, trace, k):
if len(trace) == k and sum(trace) == target:
result.append(trace.copy())
return
for i in range(len(nums)):
if len(trace) >= k: # 剪枝
break
trace.append(nums[i])
backtrace(nums[i + 1:], trace, k)
trace.pop()
backtrace(nums, trace, k)
result_tmp = [sorted(x) for x in result]
result = [x for i, x in enumerate(result_tmp) if x not in result_tmp[:i]] # 去重
print(len(result))
if __name__ == "__main__":
nums = list(map(int, input().split()))
k = int(input())
target = int(input())
combine(nums, target, k)