将整数划分为9个带有限制的非负整数

时间:2012-08-07 10:33:14

标签: algorithm puzzle partition-problem

有一个等式: 1a + 2b + 3c + 4d ... + 9i = 9

约束: 1< = a + b + c + ... + i< = 10 4

其中 a,b,..,i 是非负整数,每个整数都有一个特定的范围。

例如: 1< = a< = 5,2< = b< = 3 ,等等。

我需要找出这些变量的不同值集的数量,或简单地说,找出解决该等式的方法的数量。

有一种解决这个问题的递归方法,但这很慢。我无法想到在给定约束下有效解决这个问题的方法。

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

提示:首先提供从ia的值。这样,例如ih的高值会立即缩小较小数字的可能值范围。


确保在计算之前应用MSalters'方法。即使在这种情况下没有必要,因为问题太容易了,但总的来说它有很大的帮助。

答案 1 :(得分:1)

你基本上想要替换范围受限制的变量,所以 a' = a+1, 0 <= a' <= 4b' = 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+1a=>a-1, b=>b+1b=>b-1, c=>c+1等。

这很好地递归,但只需要8次迭代就可以得到N = 9,并且在每次迭代中你只是递增或递减9个变量。