【问题标题】:Partitioning an Integer into 9 non-negative integers with limits将整数划分为 9 个有限制的非负整数
【发布时间】:2012-08-04 08:30:02
【问题描述】:

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

约束:1 4

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

例如:1 等等。

我需要找出这些变量的不同值集的数量,或者简单地说,就是求解该方程的方法的数量。

有一种递归方法可以解决这个问题,但速度很慢。在给定的约束下,我想不出一种有效解决这个问题的方法。

【问题讨论】:

  • 您的第一个约束似乎没用。由于所有数字都是非负数,并且1a + 2b + 3c + 4d ... + 9i = 9,那么a + b + c + ... + i 肯定至少是1,最多是9
  • @HighPerformanceMark: (0,0,0,0,...,1) 满足它。 (9,0,...,0) 也是如此。它不是一个集合,但我认为这就是操作所追求的。
  • 还有{0,0,3,0,0,0,0,0}
  • 天啊。我有点过分迂腐了。

标签: algorithm puzzle partition-problem


【解决方案1】:

另一个解决方案是解决1a + 2b + 3c + 4d ... + 9i = 1(微不足道)并在给出1a + 2b + 3c + 4d ... + 9i = N 的解决方案的情况下找到1a + 2b + 3c + 4d ... + 9i = N+1 的所有解决方案。基本上就是a => a+1a=>a-1, b=>b+1b=>b-1, c=>c+1 等。

这是很好的递归,但只需要 8 次迭代即可达到 N=9,并且在每次迭代中,您只需递增或递减 9 个变量。

【讨论】:

    【解决方案2】:

    您基本上想要替换范围受限的变量,所以 a' = a+1, 0 <= a' <= 4b' = b+2, 0 <= b' <= 1。从零开始使数学更容易。它还允许您将等式重写为1a' + 2b' + ... + 9i = 4。由于所有术语都是非负的,这极大地限制了搜索空间。例如,这意味着 ei 都必须为 0。这会将等式简化为仅 `1a' + 2b' + 3c + 4d = 4

    【讨论】:

      【解决方案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
      

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


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

      【讨论】:

      • 准确来说,需要检查 5*4*3*2*2*2*2*2=1920 种可能性,如果还有可能的解决方案 - a 的值已定义。
      • @amit,如果您首先开始将值分配给具有最高系数的值,这正是您将得到的。但感谢您指出这一点。
      • @Shabaz:是的,我错过了你提到的那句话。无论如何,这应该可以解决这个维度和约束的问题。+1 为简单起见。
      猜你喜欢
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      相关资源
      最近更新 更多