查找由2个或更多A组成的21点牌的所有可能和

问题描述

假设我手上有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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...