<p>这可以用问题中没有的其他信息来解决。仪表编号只是阵列的基于一的索引。(请参见评论和备注:请将该信息编辑到问题中。不允许图片的外部链接。)</p>
<p>因为您不熟悉动态编程,而且这个问题适合于蛮力方法,所以我们将这样做。您只需要仪表号来检查约束,这可以从python的enumerate中获得。<br/>
<a href="https://docs.python.org/3/library/functions.html#enumerate" rel="nofollow noreferrer">https://docs.python.org/3/library/functions.html#enumerate</a></p>
<p>容器上的for循环不应该基于索引,而应该是类似“for a in a”这样的简单内容,但是既然我们也需要索引,那么就这样做吧</p>
<pre><code>for a_meter, a_value in enumerate(A, start=1):
for b_meter, b_value in enumerate(B, start=1):
for c_meter, c_value in enumerate(C, start=1):
for d_meter, d_value in enumerate(D, start=1):
if check_constraints(a_meter, b_meter, c_meter, d_meter):
value = sum((a_value, b_value, c_value, d_value))
pq.put(-value, value)
</code></pre>
<p>我们可以先检查约束,只包括优先级队列中传递的值</p>
<pre><code>def check_constraints(a, b, c, d):
return sum((a, b, c, d)) == 12
</code></pre>
<p>当你进行这种暴力强迫时,你真的想使用itertools。您使用这些for循环所做的基本上是itertools.product。<br/>
<a href="https://docs.python.org/3/library/itertools.html#itertools.product" rel="nofollow noreferrer">https://docs.python.org/3/library/itertools.html#itertools.product</a></p>
<p>此外,itertools并不关心您有多少不同的仪表组。使用itertools编写类似KMaxCombinations(米的集合,目标=12,K=3)的函数是很容易的(通过一些实践)</p>
<p>此外,您可以将诸如enumerate之类的迭代器直接链接到产品中。您还可以使用itertools.islice跳过不符合条件的候选人。这对这个问题没有帮助,但是如果12个不同,它可能足够高,你可以完全跳过前几个读数。或者如果它足够低,你可以跳过最后几个读数</p>