找出一手由 2 个或更多 A 组成的二十一点手牌的所有可能总和

Find all possible sums of a blackjack hand consistes of 2 or more Aces

假设我有一手 3 张 A。在二十一点中,每个 A 的值可以是 1 或 11。我需要找到所有可能的 A 总和,如下所示:

1 , 1, 1 = 3
1 , 1, 11 = 13
1, 11, 1 = 13
1, 11, 11 = 23
11, 1, 1 = 13
11, 1, 11 = 23
11, 11, 1 = 23
11, 11, 11 = 33

我的示例的输入是 3 个 A 的列表。其中有一个 API 评估每个 A 和 returns 每个 A 的两个值 (1,11) 的列表。所以输入变成类似 Z = ((1,11),(1,11),(1,11)) 的东西。并且输出应该是Z的所有可能的总和组合。注意A的输入数量是未知的!

是2^(ace数)个组合。你能指导我通过算法找到所有可能的值吗?谢谢

如果我没有正确理解你的问题:你手里有 n 个 A,想列出这手牌的所有可能值。

确定手牌价值的唯一决定是:多少个 A 算作 11?

如果我们称k这个数字,那么算作1的ace数就是n - k

这给出了以下迭代算法:

list_of_possible_values = empty_list
for (k = 0; k <= n; k++)
{
    value = k * 11 + (n - k) * 1
    list_of_possible_values.push(value)
}
return list_of_possible_values

请注意,您可以进一步简化:

value = k * 11 + (n - k) * 1
value = k * (11 - 1) + n
value = k * 10 + n

这是等差数列。 k 增加 1 导致 value 增加 10。我们可以相应地重写代码:

list_of_possible_values = empty_list
for (v = n; v <= 11*n; v+=10)
{
    list_of_possible_values.push(v)
}
return list_of_possible_values

今天的大多数语言都有预定义的函数来处理算术级数。在 python:

possible_values = range(n, 11*n+1, 10)