假设sum(xi)= 10,0< = xi< = 2,i = 1,2,...,10。如何找到xi的所有整数解。谢谢。我读过关于欧几里德算法的文章,但它看起来只是两个未知变量。这里可以使用哪些算法。
答案 0 :(得分:2)
如果您真的想拥有所有解决方案:通过一些优化递归枚举所有可能的变量赋值:
答案 1 :(得分:1)
您正在寻找数字100的integer partitions的排列,其中每个整数分区都有
当然有很多案例,但是10个!他们仍然可以通过电脑管理。
编辑:OP已编辑了问题,因此:数字10应分解为最多10个部分的整数分区,其中每个部分最多为2个。
答案 2 :(得分:1)
递归是最好的。以下是带有生成器的自然Python解决方案:
def solutions(variables, sum_left, max_value):
if 0 == variables:
if 0 == sum_left:
yield []
else:
for i in range(0, max_value + 1):
if sum_left < i:
break
else:
for partial_solution in solutions(variables - 1, sum_left - i,
max_value):
yield [i] + partial_solution
for x in solutions(10, 10, 2):
print(x)
生成器的好处在于您不必首先在内存中构建长列表。这是一个替代解决方案,它不使用生成器,也避免构建列表。
def do_something_for_solutions(variables, sum_left, max_value, known=None):
if known is None:
known = []
if 0 == variables:
if 0 == sum_left:
do_something(known)
else:
for i in range(0, max_value + 1):
if sum_left < i:
break
else:
do_something_for_solutions(variables - 1, sum_left - i,
max_value, known + [i])
def do_something(solution):
print(solution)
do_something_for_solutions(10, 10, 2)
如果您选择退回解决方案,则可以按如下方式进行:
def solutions(variables, sum_left, max_value):
if 0 == variables:
if 0 == sum_left:
return [[]]
else:
return []
else:
answer = []
for i in range(0, max_value + 1):
if sum_left < i:
break
else:
for partial_solution in solutions(variables - 1, sum_left - i,
max_value):
answer.append([i] + partial_solution)
return answer
for x in solutions(10, 10, 2):
print(x)
(请注意,如果更改参数,该列表很容易变得很大......)