项目欧拉#201

时间:2012-09-21 15:13:20

标签: algorithm language-agnostic

我一直试图解决Problem 201一段时间,但我无法想出这么大的解决方案。鉴于可能的可达总和不超过~300,000,我尝试了一种随机算法,但它只适用于具有大量计算时间的较小集合。然后我尝试了一种动态编程方法,没有任何成功。

我已经放弃了,但我很好奇如何有效地解决这个问题。

1 个答案:

答案 0 :(得分:1)

前方蠢货!

我想提出一些关于我如何解决这个问题的提示(以及表明它如何适合解决这些问题的一般方法)

提示1:为以下函数

制定(或只编写代码)递归

boolean existsRepresentation(int number,int maximalIntegerToSquare,int numberOfSquares)

如果参数号具有表示为和,则函数返回true numberOfSquares形式x ^ 2的二次项,其中最大x是maximalIntegerToSquare。因此

existsRepresentation(5,2,2)返回true,因为5 = 2 ^ 2 + 1 ^ 2但是 existsRepresentation(5,2,3)为false,因为没有不同的x,y,z< = 2,因此5 = x ^ 2 + y ^ 2 + z ^ 2

提示2:为函数

制定(或编写代码)递归

boolean existsUniqueRepresentation(int number,int maximalIntegerToSquare,int numberOfSquares)

如果参数号具有UNIQUE表示作为总和,则函数返回true numberOfSquares格式x ^ 2的二次项,其中最大x小于或等于maximalIntegerToSquare(递归应该包含函数) existsUniqueRepresentation和函数existsHepresentation来自HINT 1 使用较小的参数值)。因此

existsUniqueRepresentation(5,2,2)返回true,因为5 = 2 ^ 2 + 1 ^ 2并且没有其他5的表示形式作为两个不同正方形的总和x ^ 2 + y ^ 2 x< y(正在最大y = 2,如果需要或另外)

existsUniqueRepresentation(5,2,3)是假的,因为没有5的表示(因而没有唯一的表示)作为3个不同数字的3个正方形的总和小于或等于2(没有x, y,z为1< = x< y< z< = 2 ..)

existsUniqueRepresentation(89,8,3)和existsUniqueRepresentation(89,9,3)是假的,因为 89 = 8 ^ 2 + 4 ^ 2 + 3 ^ 2和89 = 7 ^ 2 + 6 ^ 2 + 2 ^ 2.

你给自己提示3:使用动态编程,你需要缓存existsRepresentation()或existsUniqueRepresentation()返回的每个值。 (实际上这在教科书中称为“memoization”,动态编程是指一种组织缓存值以便在不进行递归调用的情况下进行计算的方法,但重点是始终将解决方案缓存到子问题中。)

所以一般的方法是:将问题表达为递归..然后缓存所有移动的东西! (你的电脑上有足够内存的所有东西,就是......)

它起作用(这里和许多其他问题)!