制作序列的数字之和

时间:2010-08-12 04:48:44

标签: algorithm language-agnostic discrete-mathematics

昨晚看橄榄球时,我想知道是否有任何分数是不可能的,因为你只能得到3,5或7分的分数。不用花很长时间就可以得出任何大于4的数字。 5 = 5,6 = 3 + 3,7 = 7,8 = 3 + 5,9 = 3 + 3 + 3,10 = 5 + 5等等。

对5,7和9的想法进行扩展会产生以下可能的分数:

5,7,9,10,12,14 // and now all numbers are possible.  

对于7,9和11:

7,9,11,14,16,18,20,22,23,25,27 // all possible from here

我在脑海中做了这些,有人可以提出一个好的算法来确定最低分数,高于该分数,在给定一组分数的情况下,所有分数都可以达到。

我这样建模:

forall a < 10:
   forall b < 10:
      forall c < 10:
          list.add(3a + 5b + 7c);
list.sort_smallest_first();

然后检查列表中是否有超过3的序列(可能的最小分数)。对于除了琐碎案件之外的任何事情,似乎都是不切实际和缓慢的。

1 个答案:

答案 0 :(得分:8)

只有一个无法达到的数字,所有分数都可以达到。

这称为frobenius数字。请参阅:http://en.wikipedia.org/wiki/Frobenius_number

维基页面应该有算法的链接来解决它,例如:http://www.combinatorics.org/Volume_12/PDF/v12i1r27.pdf

对于2个数字a,b一个确切的公式(ab-ab)是已知的(可用于减少搜索空间),对于3个数字a,b,ca sharp lower bound(sqrt(3abc) - abc)和相当快的算法是已知的。

如果数字是算术级数,那么确切的公式是已知的(参见wiki)。我之所以提到这一点,是因为在你的例子中,所有数字都是算术级数。

所以要回答你的问题,找到Frobenius数字并加1。

希望有所帮助。