我有一个由N个整数值组成的字典,如下所示:
units = {'trooper':2, 'tank':10, 'helicopter':12}
我也有一个目标值...比如120。
我试图找到方程式的所有可能结果:
a*units['trooper'] + b*units['tank'] + c*units['helicopter'] = 120
所以结果看起来像是:
60*trooper
55*trooper + 1*tank
54*trooper + 1*helicopter
以及所有可能的d键组合......
我该怎么做呢?
答案 0 :(得分:4)
如果您知道它们的名称,那么搜索这些问题的解决方案是最简单的。 Google为Diophantine equations。
在Python世界中,您可以使用包含丢番图方程求解器的Sympy package。该软件包简化了您的问题:
from sympy import symbols
from sympy.solvers.diophantine import diop_solve
trooper, tank, helicopter = symbols('trooper tank helicopter', integer=True)
print diop_solve(2*trooper + 10*tank + 12*helicopter - 120)
输出:
(5*t - trooper + 60, -6*t + trooper - 60, trooper)
您还可以搜索"ways to make change",这是表达问题的另一种方式。一个相关的问题叫做The Knapsack Problem,很难解决。解决线性丢番图方程的一般系统背后的数学是有点涉及的。以下是一些资源:
答案 1 :(得分:0)
这样的东西适用于目标值的小值:
units = {'trooper':2, 'tank':10, 'helicopter':12}
total = 120
for i in range(int(total/units['helicopter'])):
for j in range(int(total/units['tank'])):
if (total-units['helicopter']*i-units['tank']*j)%2==0 and (total-units['helicopter']*i-units['tank']*j)>0:
print ((total-units['helicopter']*i-units['tank']*j)/2,j,i)