问题陈述:
让
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()
答案 0 :(得分:2)
我相信您的np.zeroes
声明中使用的NumPy数据类型为a restricted rather than unlimited number。实际上,2301的分区数是17022871133751751761754598643267756804218108498650480,而不是17022871133751703703227227846846952967314604032000000,您可以通过使用常规表声明来运行(正确的)程序,例如
table = [10000 * [0] for i in xrange(10000)]
然后在表上适当调用。