为了账号安全,请及时绑定邮箱和手机立即绑定

具有总和为给定值的三元组的 If/else 语句

具有总和为给定值的三元组的 If/else 语句

largeQ 2023-04-25 16:06:18
我正在写一个总结游戏,其中两个玩家将轮流选择一个范围内的随机数(1,9),不允许重复的数字。所以我在努力如果在任何时候玩家的三个数字总和为 15,则该玩家获胜。如果第一个玩家选择 [7, 2, 3, 5],他将获胜,因为 7+3+5 = 15所以我的问题是为什么当 first_player 的输入 == 15 时程序不停止我想避免导入任何库。
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

不是在每一步生成所有排列,而是维护每个排列总和的映射,然后在每次移动时向每个分支添加两个分支。


将每个条目视为一组位,即对于每个排列,您可以包含或不包含给定的条目,例如,如果数字是 [7, 3, 2],您可以存储 [1, 0, 1] 作为组合7 和 2。


您可以制作 101->9 等的哈希图,当有人向其中添加 3 时,您可以为 1010->9 和 1011->12 添加一个条目。一旦你看到目标,你就知道游戏结束了。


所以 [7, 3, 2] 的演化将是


0->0

1->7

00->0

01->3

10->7

11->10

000->0

001->2

010->3

011->5

100->7

101->9

110->10

111->12


查看完整回答
反对 回复 2023-04-25
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

一种更有效的方法是只找到那些总和等于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


查看完整回答
反对 回复 2023-04-25
?
萧十郎

TA贡献1815条经验 获得超12个赞

一种低效但简单的方法是使用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用新数字扩展时你都会尝试所有排列。


查看完整回答
反对 回复 2023-04-25
  • 3 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信