def f(N):
assert isinstance(N, int) and N >= 1
return 1 if N <= 1 else N * f(N-1)
def p(n, k): #permutations
return f(n) / f(n - k)
def c(n, k): #combinations
return f(n) / (f(k) * f(n-k))
list_a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
list_n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
total_possible_outcomes = 11! = 39,916,800
list_a中的每个项目在list_n中都有一个正确的对。
你被告知'a2'对不正确。
total_possible_outcomes = 36,288,000
然后,你会得到:
list_guess1 = [a1, b2, c3, d4, e5, f6, g7, h8, i9, j10, k11]
guess(list_guess1) #returns 3
list_guess1返回3意味着有3个正确的对。实际上没有正确的猜测。假设你和我都不知道正确的对子集,而是需要找到剩余的total_possible_outcomes的数量。当total_possible_out_comes = 1时,我会遇到新问题。
combinations_of_guess1 = c(11, 3) #returns 165
剩下多少种可能的组合?
我想制作一个程序来计算结果。
给定更多数据(更多不正确的对和具有n个正确猜测的列表),我想编写一个函数来显示total_possible_outcomes。
最后,我想在给出足够的数据时显示唯一剩下的正确答案。
我可以编写代码,首先生成完整的39,916,800项目列表,然后对其进行165次以上的迭代,但这只是一种糟糕的做事方式。我需要一种更好的方法来完成这项任务,同时降低时间复杂度。
答案 0 :(得分:0)
有3个正确的猜测。您可以在11种配对中分配多少种方式?那将是11C3。
现在,对于这些发行版中的每个,您有8个未绑定的配对;你所知道的是,每个字母的给定配对都是错误的。举个例子,让我们使用最后三个是正确的:i9, j10, k11
。前8个是错的。你现在剩下7个选择。
然而,这种计算并非无足轻重。如果你选择a2
,那么b仍有7种选择;如果你为a
选择了其他任何内容,那么b
只有6个选项。
我建议您编写一个递归例程来执行此计算,记住结果(动态编程)。这将在人的一生中运行。
这足以让你感动吗?
更新
我编写了递归代码来对整个集合进行可能性计数(不受正确猜测限制),手动验证4和5个元素。我在全套11上运行它,好像a2和“正常”匹配(a1 b2 c3等)都错了。我没有打扰DP,只是为了看看时间是什么样的。它在大约15秒内返回了15574544的计数,我认为你绝对不需要动态编程开销。