样例输入:一个数组 [99,199,1999,10000,39,1499]
目标值 10238
结果应该输出1
第一种方法:排列组合。时间复杂度异常大,先上。下面第二种方法来优化。
def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = list(range(r))
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
def miHomeGiftBag(p, M):
Sum = 0
list1 = []
sub = []
for i in range(2,len(p)+1):
for x in combinations(p,i):
if sum(x) == M:
return 1
return 0
p = [99,199,1999,10000,39,1499]
print(miHomeGiftBag(p,10238))
结果如下:
1
第二种方法:动态规划。(因为笔试不能用numpy,而我觉得numpy比较方便,所以这里是用了numpy,如果不希望用numpy,我在java的动态规划文章中有论述这题如何做。)
import numpy as np
def dp_subset(arr,target):
subset = np.zeros((len(arr),target+1),dtype=bool)
subset[0,:] = False
subset[:,0] = True
subset[0,arr[0]] = True
for i in range(1,len(arr)):
for j in range(1,target+1):
if arr[i] > j:
subset[i,j] = subset[i-1,j]
else:
A = subset[i-1,j]
B = subset[i-1,j-arr[i]]
subset[i,j] = A or B
r,l = subset.shape
print(subset[0][90:150])
return subset[r-1,l-1]
arr1 = [99,199,1999,10000,39,1499]
结果如下:
True