我正在做欧拉计划问题78
让
p(n)
代表n
硬币可以分成不同堆的不同方式的数量。例如,可以用完全不同的七种方式将五枚硬币分成几堆,因此p(5)=7
找到
n
可以被p(n)
整除一百万的最小值。
我正在尝试使用递归解决此问题。我知道这既不是最佳解决方案,也不是最快的解决方案,但我想尽可能地使这项工作可行。在n = 6000
附近,我得到了:
MemoryError:堆栈溢出
这不是唯一的问题。我在网上检查过,解决方案约为53,000。我的矩阵只有10,000x10,000。如果我转到60,000x60,000,则返回MemoryError。 这是我的代码:
import sys
from time import process_time as timeit
sys.setrecursionlimit(100000)
table = [10000 * [0] for i in range(10000)]
def partition(sum, largestNumber):
if (largestNumber == 0):
return 0
if (sum == 0):
return 1
if (sum < 0):
return 0
if (table[sum][largestNumber] != 0):
return table[sum][largestNumber]
table[sum][largestNumber] = partition(sum,largestNumber-1) + partition(sum-largestNumber,largestNumber)
return table[sum][largestNumber]
def main():
result = 0
sum = 0
largestNumber = 0
while (result == 0 or result%100000 != 0):
sum += 1
largestNumber += 1
result = int(partition(sum,largestNumber))
if sum%1000 == 0:
print('{} {}'.format(sum,timeit()))
print("n = {}, resultado = {}".format(sum,result))
print('Tempo = {}'.format(timeit()))
if __name__ == '__main__':
main()