我正在写一个小纸牌游戏,其中两个玩家手中各有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)。
答案 0 :(得分:2)
您尝试计算的组合称为integer partitions。相应地,你正在追踪integer partition algorithm。
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)
这在概念上类似于Knuth的algorithm P in fascicle 3B。