有一个等式: 1a + 2b + 3c + 4d ... + 9i = 9
约束: 1< = a + b + c + ... + i< = 10 4
其中 a,b,..,i 是非负整数,每个整数都有一个特定的范围。
例如: 1< = a< = 5,2< = b< = 3 ,等等。
我需要找出这些变量的不同值集的数量,或简单地说,找出解决该等式的方法的数量。
有一种解决这个问题的递归方法,但这很慢。我无法想到在给定约束下有效解决这个问题的方法。
答案 0 :(得分:2)
如果您考虑一下,解决方案实际上非常有限。
由于所有数字都是非负数,而且您有:
1a + 2b + 3c + 4d ... + 9i = 9
这意味着:
0 <= a <= 9
0 <= b <= 4
0 <= c <= 3
0 <= d <= 2
0 <= e <= 1
0 <= f <= 1
0 <= g <= 1
0 <= h <= 1
0 <= i <= 1
也就是说,只考虑10*5*4*3*2*2*2*2*2 = 19200
个案例。
您可以遍历这些案例,找出哪些案例满足您的其他约束条件
1a + 2b + 3c + 4d ... + 9i = 9
提示:首先提供从i
到a
的值。这样,例如i
或h
的高值会立即缩小较小数字的可能值范围。
确保在计算之前应用MSalters'方法。即使在这种情况下没有必要,因为问题太容易了,但总的来说它有很大的帮助。
答案 1 :(得分:1)
你基本上想要替换范围受限制的变量,所以
a' = a+1, 0 <= a' <= 4
和b' = b+2, 0 <= b' <= 1
。从零开始使数学更容易。它还允许您将等式重写为1a' + 2b' + ... + 9i = 4
。由于所有术语都是非负的,这极大地限制了搜索空间。例如,这意味着e
最多i
必须全部为0.这会将公式简化为`1a' + 2b' + 3c + 4d = 4
。
答案 2 :(得分:1)
另一个解决方案是解决1a + 2b + 3c + 4d ... + 9i = 1
(平凡)并找到1a + 2b + 3c + 4d ... + 9i = N+1
的所有解决方案给出1a + 2b + 3c + 4d ... + 9i = N
的解决方案。这基本上是a => a+1
或a=>a-1, b=>b+1
或b=>b-1, c=>c+1
等。
这很好地递归,但只需要8次迭代就可以得到N = 9,并且在每次迭代中你只是递增或递减9个变量。