欧拉项目78-硬币分割

时间:2019-03-14 14:31:18

标签: python python-3.x recursion

问题陈述:

  

p(n)代表n硬币可以分成不同堆的不同方式的数量。例如,可以用完全不同的七种方式将五枚硬币分成几堆,因此p(5)=7

     

找到n可以被p(n)整除一百万的最小值。

所以这是我使用递归来解决此问题的代码。我知道这不是最佳方法,但是应该给我正确的答案...但是由于某些原因,我不明白这使我想起n = 2301的ap(n)= 17022871133751703055055888888846952967314604032000000,可以被1,000,000整除并且是最少的n这样做。那么,为什么这不是正确的答案呢? 我检查了n <20并匹配。那我的代码怎么了?

import numpy as np
import sys

sys.setrecursionlimit(3000)

table = np.zeros((10000,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%1000000 != 0):
        sum += 1
        largestNumber += 1
        result = int(partition(sum,largestNumber))
        print("n = {}, resultado = {}".format(sum,result))

    return 0

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:2)

我相信您的np.zeroes声明中使用的NumPy数据类型为a restricted rather than unlimited number。实际上,2301的分区数是17022871133751751761754598643267756804218108498650480,而不是17022871133751703703227227846846952967314604032000000,您可以通过使用常规表声明来运行(正确的)程序,例如

table = [10000 * [0] for i in xrange(10000)]

然后在表上适当调用。