algorithm - 将一个整数划分为 9 个有限制的非负整数

标签 algorithm puzzle partition-problem

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

约束条件:1 <= a + b + c + ... + i <= 104

其中 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

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


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

关于algorithm - 将一个整数划分为 9 个有限制的非负整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11844038/

相关文章:

c++ - 优化找到特定斐波那契数的算法

algorithm - 找到最小的重叠作业集

algorithm - 集合分区比差分结果更好

algorithm - 给定一组 20 个不同的正整数,找到两个具有相同总和的子集

c++ - 分区解决太慢

algorithm - 'finding the max in an array' 可能达到多快?

algorithm - 给定程序的递归关系

algorithm - 更改 FFT 内容

language-agnostic - 单词混杂算法

c++ - 在 C 中,如何在执行另一个功能时不断获取用户输入?