问题描述
假设我手上有3张A。在二十一点中,每个Ace的值可以为1或11。我需要找到Ace的所有可能的总和,如下所示:
VString
我的示例的输入是3个A的列表。这里有一个API可以评估每个Ace,并为每个Ace返回两个值(1,11)的列表。因此输入变成类似Z =((1,11),(1,11))的东西。并且输出应该是Z的所有可能的总和。请注意,输入的Aces数是未知的!
是2 ^(王牌数)组合数。您能否指导我完成算法以找到所有可能的值?谢谢
解决方法
如果我正确理解了您的问题:您的手牌中有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)