【发布时间】:2018-03-13 01:26:42
【问题描述】:
我有一组正整数
values = [15, 23, 6, 14, 16, 24, 7]
可以通过替换来选择,以求和为 0 到 24(含)之间的数字,其中使用的值越少越好。
例如,16 + 16 (mod 25) = 32 (mod 25) = 7 但 7 (mod 25) = 7 使用较少的加法,因此是首选。
我目前的方法是顺序越来越多地嵌套 for 循环以生成直到某个点的所有可能答案,然后找到眼睛所需的最少数量的值。我使用快速排序作为一个单独的函数来避免重复的答案。
answers = []
for i in values:
if i % 25 == n:
if [i] not in answers:
answers.append([i])
if not answers:
for i in values:
for j in values:
if (i + j) % 25 == n:
check = quicksort([i, j])
if check not in answers:
answers.append(check)
if not answers:
for i in values:
for j in values:
for k in values:
if (i + j + k) % 25 == n:
check = quicksort([i, j, k])
if check not in answers:
answers.append(check)
for i in answers:
print(i)
然后是一个典型的输出
[14, 14]
从中我可以看出 [14, 14] 是最有效的总和。
我从暴力破解中知道,对 n 的所有可能选择求和最多需要四个值,但这似乎是一种非常乏味的寻找最有效总和的方法。有没有更优雅的算法?
编辑:额外的例子。
如果我们选择 n = 13,代码会吐出来
[15, 23]
[6, 7]
[14, 24]
并选择 n = 18 个输出
[14, 15, 15]
[6, 15, 23]
[23, 23, 23]
[7, 14, 23]
[6, 6, 7]
[6, 14, 24]
[14, 14, 16]
为了澄清,代码有效;它只是看起来凌乱且不必要的彻底。
【问题讨论】:
-
您能否提供另一个解决方案的示例,以便清楚您的程序在做什么。
-
我已经用更多示例更新了问题