有一个等式:1a + 2b + 3c + 4d ... + 9i = 9
约束:1 <= a + b + c + ... + i <= 10 4
其中a,b,..,i是非负整数,每个整数都有一个特定的范围。
例如:1 <= a <= 5、2 <= b <= 3等等。
我需要找出这些变量的不同值集的数量,或者简单地说,解决该方程的方法的数量。
有一种递归方法可以解决这个问题,但这很慢。在给定的约束下,我无法想出一种有效解决此问题的方法。
有一个等式:1a + 2b + 3c + 4d ... + 9i = 9
约束:1 <= a + b + c + ... + i <= 10 4
其中a,b,..,i是非负整数,每个整数都有一个特定的范围。
例如:1 <= a <= 5、2 <= b <= 3等等。
我需要找出这些变量的不同值集的数量,或者简单地说,解决该方程的方法的数量。
有一种递归方法可以解决这个问题,但这很慢。在给定的约束下,我无法想出一种有效解决此问题的方法。
如果你仔细想想,解决方案实际上是非常有限的。
由于所有数字都是非负数,因此您有:
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的方法。尽管在这种情况下没有必要,因为问题太简单了,但总的来说它有很大帮助。
您基本上想要替换范围受到限制的变量,所以
a' = a+1, 0 <= a' <= 4
和b' = b+2, 0 <= b' <= 1
。从零开始使数学更容易。它还允许您将等式重写为1a' + 2b' + ... + 9i = 4
。由于所有术语都是非负的,这极大地限制了搜索空间。例如,这意味着e
upi
必须全部为 0。这将等式简化为`1a' + 2b' + 3c + 4d = 4
。
另一种解决方案是解决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 个变量。