3

我正在写一个小纸牌游戏,其中两个玩家每人手里有 4 张牌,他们必须在桌子上拿尽可能多的牌加起来。它使用经典的扑克牌,所以相同的种子和相同的值。

King can only take another King
Queen can only take another Queen 
Jack can only take another Jack

编号的卡片可以按总和计算,例如:

10H takes 6C + 4S
5S takes 3C + 2D or 3S + 2D
7S takes 4S + 3S or 5C + 2D
And so on...

种子无关紧要……只有价值观才是。但问题是我需要计算唯一的组合。因此,例如,我只想要其中一个组合,因为种子和值是相同的:

10H -> 6C + 4S
10H -> 4S + 6C

是否有任何预制功能可以做到这一点?我试着用谷歌和维基百科四处寻找,但可能我不知道算法/问题的英文名称。哦...我忘记了...解决方案可以是您想要的任何解决方案(普通,递归,linq)。

4

1 回答 1

2

您尝试计算的组合称为整数分区。相应地,您在使用整数分区算法

python 中的解决方案可能如下所示:

def bubble(part, i=0): #add one to the list whilst keeping lexicographic order
    if i == (len(part)-1) or part[i] < part[i+1]:
        part[i] += 1
        return part
    else:
        return bubble(part, i+1)

def partitions(n):
    if n == 1:
        yield [1]
        return
    for p in partitions(n-1):
        yield [1] + p
        yield bubble(p)

这在概念上类似于分册 3B 中的 Knuth 算法P。

于 2013-01-22T11:37:42.660 回答