<p>分而治之,利用这样的知识,如果你有13和选择10,你只需选择的卡和3左看。。。警告这个解决方案可能很慢(在我的盒子上花了大约180秒。。。这绝对不是最佳的。。在</p>
<pre><code>def sum_to(x,cards):
if x == 0: # if there is nothing left to sum to
yield []
for i in range(1,12): # for each point value 1..11 (inclusive)
if i > x: break # if i is bigger than whats left we are done
card_v = 11 if i == 1 else i
if card_v not in cards: continue # if there is no more of this card
new_deck = cards[:] # create a copy of hte deck (we do not want to modify the original)
if i == 1: # one is clearly an ace...
new_deck.remove(11)
else: # remove the value
new_deck.remove(i)
# on the recursive call we need to subtract our recent pick
for result in sum_to(x-i,new_deck):
yield [i] + result # append each further combination to our solutions
</code></pre>
<p>按以下步骤设置您的卡</p>
^{2}$
<p>那就打电话给你的部门</p>
<pre><code>for combination in sum_to(21,deck):
print combination
</code></pre>
<p>不幸的是,这确实允许一些复制品潜入。。。
为了得到唯一的条目,你需要稍微改变一下</p>
<p>在<code>sum_to</code>的最后一行将其更改为</p>
<pre><code> # sort our solutions so we can later eliminate duplicates
yield sorted([i] + result) # append each further combination to our solutions
</code></pre>
<p>然后当你得到你的组合,你必须做一些深黑色伏都教风格的Python</p>
<pre><code> unique_combinations = sorted(set(map(tuple,sum_to(21,deck))),key=len,reverse=0)
for combo in unique_combinations: print combo
</code></pre>
<p>从这个很酷的问题中,我学到了以下几点(记住,在真实的游戏中,你会让庄家和其他玩家也从同一个牌堆中移出)</p>
<pre><code>there are 416 unique combinations of a deck of cards that make 21
there are 300433 non-unique combinations!!!
the longest number of ways to make 21 are as follows
with 11 cards there are 1 ways
[(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3)]
with 10 cards there are 7 ways
with 9 cards there are 26 ways
with 8 cards there are 54 ways
with 7 cards there are 84 ways
with 6 cards there are 94 ways
with 5 cards there are 83 ways
with 4 cards there are 49 ways
with 3 cards there are 17 ways
with 2 cards there are 1 ways
[(10, 11)]
there are 54 ways in which all 4 aces are used in making 21!!
there are 106 ways of making 21 in which NO aces are used !!!
</code></pre>
<p>记住,这些通常是次优的打法(即考虑A,10->1,10和击球)</p>