-
红颜莎娜
不是在每一步生成所有排列,而是维护每个排列总和的映射,然后在每次移动时向每个分支添加两个分支。将每个条目视为一组位,即对于每个排列,您可以包含或不包含给定的条目,例如,如果数字是 [7, 3, 2],您可以存储 [1, 0, 1] 作为组合7 和 2。您可以制作 101->9 等的哈希图,当有人向其中添加 3 时,您可以为 1010->9 和 1011->12 添加一个条目。一旦你看到目标,你就知道游戏结束了。所以 [7, 3, 2] 的演化将是0->01->700->001->310->711->10000->0001->2010->3011->5100->7101->9110->10111->12
-
慕田峪4524236
一种更有效的方法是只找到那些总和等于target15 的数字。entry = [7, 5, 1, 3]def is_sum_15(nums): res = [] search_numbers(nums, 3, 15, 0, [], res) return len(res) != 0 def search_numbers(nums, k, n, index, path, res): if k < 0 or n < 0: return if k == 0 and n == 0: res.append(path) for i in range(index, len(nums)): search_numbers(nums, k-1, n-nums[i], i+1, path+[nums[i]], res)print(is_sum_15(entry)) # True
-
萧十郎
一种低效但简单的方法是使用itertools.permutations:>>> entry = [7, 2, 3, 5]>>> import itertools>>> [sum(triplet) for triplet in itertools.permutations(entry, r=3) if sum(tr][12, 14, 12, 15, 14, 15, 12, 14, 12, 10, 14, 10, 12, 15, 12, 10, 15, 10, 14, 15, 14, 10, 15, 10]>>> any(sum(triplet) == 15 for triplet in itertools.permutations(entry, r=3))True这是低效的,因为每次entry用新数字扩展时你都会尝试所有排列。