我试图在python中实现一个算法,用给定的和计算子集,这是
import numpy as np
maxN = 20
maxSum = 1000
minSum = 1000
base = 1000
dp = np.zeros((maxN, maxSum + minSum))
v = np.zeros((maxN, maxSum + minSum))
# Function to return the required count
def findCnt(arr, i, required_sum, n) :
# Base case
if (i == n) :
if (required_sum == 0) :
return 1
else :
return 0
# If the state has been solved before
# return the value of the state
if (v[i][required_sum + base]) :
return dp[i][required_sum + base]
# Setting the state as solved
v[i][required_sum + base] = 1
# Recurrence relation
dp[i][required_sum + base] = findCnt(arr, i + 1, required_sum, n) + findCnt(arr, i + 1, required_sum - arr[i], n)
return dp[i][required_sum + base]
arr = [ 2, 2, 2, 4 ]
n = len(arr)
k = 4
print(findCnt(arr, 0, k, n))
它给出了预期的结果,但我被要求不要使用numpy,所以我用嵌套列表替换了numpy数组,如下所示:
#dp = np.zeros((maxN, maxSum + minSum)) replaced by
dp = [[0]*(maxSum + minSum)]*maxN
#v = np.zeros((maxN, maxSum + minSum)) replaced by
v = [[0]*(maxSum + minSum)]*maxN
但是现在程序在输出中总是给我0,我想这是因为numpy数组和嵌套列表之间的一些行为差异,但是我不知道如何修复它
编辑:
感谢在评论中提供此解决方案的@venky_uuuuuuu:
[[0 for i in range( maxSum + minSum)] for i in range(maxN)]
虽然成功了,但我仍然不明白它和我以前所做的有什么区别,我试着:
print( [[0 for i in range( maxSum + minSum)] for i in range(maxN)] == [[0]*(maxSum + minSum)]*maxN )
结果是True
,那么这是如何解决问题的呢
事实证明,我使用嵌套列表表示2d数组的方式是错误的,因为python并没有包含单独的对象,但相同的子列表索引引用相同的整数对象,为了更好地解释,请阅读this
相关问题 更多 >
编程相关推荐