import mathimport timedef FindRoad(target: [], m: int): def isvalid(result, target): temp = result['values'] base = sorted(target) output = sorted([j - i for i in temp for j in temp if j > i]) for i in range(len(base)): if output[i] != base[i]: return False return True def isvalid2(num, target): if num > m: return False if num not in target: return False return True def dfs(target, result): target_dict = {k: 0 for k in target for v in range(len(target))} # base case if len(result['values']) == length: if result['values'][-1] == m: if isvalid(result, target): results.append(result) print(result) # make progress else: for i in range(len(target)): if target_dict[target[i]] == 1: # 同一层次, 该元素已经被选择了 continue # 标记为已选元素 target_dict[target[i]] = 1 b if result['path'][i] == 1: target_dict[target[i]] = 0 continue # 可能的下个元素的值 temp = result['values'][-1] + target[i] if not isvalid2(temp, target): continue result['values'].append(temp) result['path'][i] = 1 dfs(target, result) result['path'][i] = 0 result['values'].remove(temp) length = int(math.sqrt((2 * len(target) + 1))) + 1 # 同一层次只做一次相同选择 results = [] result = { 'values': [], 'path': [0 for i in range(len(target))] } result['values'].append(0) dfs(target, result)nums = [3, 3, 3, 4, 5, 5, 5, 6, 7, 8, 10, 1, 2, 2, 2]nums = [1, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5, 6, 7, 8, 8, 10, 10, 11, 12, 13, 13, 15, 15, 16, 18, 18, 21]t1 = time.process_time()FindRoad(nums, 21)t2 = time.process_time()print(t2-t1)#
总结